【问题标题】:looping call in python twisted is not workingpython twisted中的循环调用不起作用
【发布时间】:2012-12-18 00:43:43
【问题描述】:

我正在为我的实时项目使用 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,因为远程机器已刷新,并且它可以在几分钟后再次准备好提供服务。所以,我经常调用它。

但它没有被调用,而是被挂断了很长时间。

你能帮忙解决这个问题吗?

【问题讨论】:

    标签: python twisted twisted.web twisted.internet


    【解决方案1】:

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

    【讨论】:

    • 对不起,请原谅,我们必须在每次回调中分配延迟回调,以防重启逻辑必须在每次回调中移植任何错误。我正确吗?跨度>
    • 首先,您只需执行lc.start(120).addErrback(twisted.python.log.err)。如果这揭示了一些有趣的事情,那么您只需将 twisted.python.log.err 替换为其中包含更多逻辑的 errback,例如(例如)再次调用 lc.start(并再次添加一个 errback)。
    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多