如果发生异常,则停止task.LoopingCall

时间:2014-05-24 16:14:43

标签: python twisted twisted.internet

我是Twisted的新手,在最终弄清楚延迟是如何工作之后,我正在努力完成这些任务。我想要实现的是拥有一个在循环中发送REST请求的脚本,但是如果在某些时候它失败了我想要停止循环。由于我正在使用回调,因此我无法轻易捕获异常,因为我不知道如何停止从错误中恢复循环。

这是我的代码的简化版本:

def send_request():
    agent = Agent(reactor)
    req_result = agent.request('GET', some_rest_link)
    req_result.addCallbacks(cp_process_request, cb_process_error)

if __name__ == "__main__":
    list_call = task.LoopingCall(send_request)
    list_call.start(2)
    reactor.run()

1 个答案:

答案 0 :(得分:3)

要结束task.LoopingCall,您需要做的只是在回复对象上调用stop(在您的情况下为list_call)。

不知何故,您需要将该变量提供给您的errback(cb_process_error),方法是将其推送到cb_process_error所在的类,通过其他用作伪全局的类或字面意思使用全局,然后只需在errback中调用list_call.stop()

你告诉BTW:

  

由于我使用回调,因此我无法轻易捕获异常

这不是真的。处理异常的错误指向,这是导致它被调用的事情之一!查看我之前的deferred answer,看看它是否使错误更明确。

以下是一个可运行的示例(...我并不是说这是最好的方式,只是它是 方式。 ..)

#!/usr/bin/python

from twisted.internet import task
from twisted.internet import reactor
from twisted.internet.defer import Deferred
from twisted.web.client import Agent
from pprint import pprint

class LoopingStuff (object):

    def cp_process_request(self, return_obj):
        print "In callback"
        pprint (return_obj)

    def cb_process_error(self, return_obj):
        print "In Errorback"
        pprint(return_obj)
        self.loopstopper()

    def send_request(self):
        agent = Agent(reactor)
        req_result = agent.request('GET', 'http://google.com')
        req_result.addCallbacks(self.cp_process_request, self.cb_process_error)

def main():
    looping_stuff_holder = LoopingStuff()
    list_call = task.LoopingCall(looping_stuff_holder.send_request)
    looping_stuff_holder.loopstopper = list_call.stop
    list_call.start(2)
    reactor.callLater(10, reactor.stop)
    reactor.run()

if __name__ == '__main__':
  main()

假设您可以访问google.com,如果您将agent.request的第二个arg更改为http://127.0.0.1:12999(假设端口12999将提供连接被拒绝)然后你会看到1个errback打印输出(它也会关闭循环调用)并等待10秒,直到反应堆关闭。