2

我正在为我的实时项目使用 python twisted。

说明:我正在为我向远程机器发出请求的 url 拉取 html 页面。因此,我在我的数据库机器中维护调度程序,该调度程序向远程机器发送请求并通过发布 url 参数以扭曲的方式异步获取结果.

因此,在扭曲中,无论我们得到结果成功回调链还是错误回调链,我每两分钟在“LoopingCall 服务”中运行一次主方法。我将每 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

4

Deferred向返回的添加一个 errback LoopingCall.start,至少记录发生的任何错误。 LoopingCall一旦其可调用对象引发异常就停止。添加 errback 将向您显示异常是什么,并为您提供放置一些代码以重新启动LoopingCall.

于 2013-01-03T16:18:59.390 回答