私はリアルタイムプロジェクトに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 を再度呼び出す必要がありますが、頻繁に呼び出しています。
しかし、それは呼び出されない代わりに、非常に多くの時間をハングアップします。
この問題を助けていただけますか?