2

私はリアルタイムプロジェクトにpython twistedを使用しています。

説明: リモート マシンにリクエストを送信する URL の html ページをプルしています。そのため、リモート マシンにリクエストを送信し、url パラメータをポストすることによって結果を非同期的に取得するスケジューラをデータベース マシンに維持しています。 .

したがって、ツイストでは、結果の成功コールバック チェーンまたはエラー コールバック チェーンを取得するかどうかにかかわらず、「LoopingCall サービス」でメイン メソッドを 2 分ごとに実行します。メイン メソッドは 2 分ごとに開始します。

このシナリオでは、1 つの要求が戻ってこない場合にエラーが発生します。他のリモート マシンは引き続きサービスに使用できます。したがって、どのような場合でも、メイン メソッドは 2 分ごとに呼び出される必要があります。エラー。

     from twisted.internet.task import LoopingCall
     from twisted.internet import reactor
     from twisted.internet import defer
     from twisted.web import client

    def service_avail_check():
        ip_list = get_all_ws_hosts()
        for i in ip_list:
           url = "http://" + i[0] + ":8080/dm/"
           print url
           server_ip = i[0]
           client\
             .getPage(url)\
             .addCallback(service_avail_handler, server_ip)\
             .addErrback(service_avail_error, server_ip)

     def service_avail_handler(data, server_ip):
         if data.strip() == 'pong':
             mark_the_service_avail(server_ip)
             crawler_avail_check(server_ip)
         else:
            mark_the_service_unavail(server_ip)


     def service_avail_error(failure, server_ip):
          print >> sys.stderr, "Error:", failure.getErrorMessage()
          print 'server ping error sever ip: '+ server_ip
          mark_the_service_unavail(server_ip)

    lc = LoopingCall(service_avail_check)
    lc.start(120)
    reactor.run()

説明:

1.service_avail_check is my main method.it fetches the remote machine and sends the request
2.based on the response the corresponding call back is called
3.I am calling other methods to update into memory

クライアントがうまく応答しない場合、エラーが発生することがあります。

 crawl_handle Error: Connection was closed cleanly.
 Traceback (most recent call last):
 Failure: twisted.internet.error.ConnectionDone: Connection was closed cleanly.
 None

リモートマシンがフラッシュされ、数分後にサービスを提供する準備が整う可能性があるため、service_avail_check を再度呼び出す必要がありますが、頻繁に呼び出しています。

しかし、それは呼び出されない代わりに、非常に多くの時間をハングアップします。

この問題を助けていただけますか?

4

1 に答える 1