我正在使用python twisted来实现我的实时项目。
说明: 我正在为我向远程机器发出请求的url拉html页面。所以,我在我的数据库机器中维护调度程序,它向远程机器发送请求,并通过发布url param以扭曲方式异步获取结果。 / p>
所以,在扭曲中我每两分钟运行一次“LoopingCall服务”中的main方法,无论我们得到结果成功回调链还是错误的回调链。我将每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,因为远程计算机已被刷新,并且几分钟后它就可以准备好提供服务了。所以,我经常调用它。
但它没有被调用而是被挂起很长时间。
你可以帮忙解决这个问题吗?答案 0 :(得分:4)
向Deferred
返回的LoopingCall.start
添加一个errback,至少记录发生的错误。 LoopingCall
一旦其callable引发异常就会停止。添加errback会显示异常是什么,并为您提供一些位置来放置一些代码来重新启动LoopingCall
。