我是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()
答案 0 :(得分:3)
要结束task.LoopingCall
,您需要做的只是在回复对象上调用stop
(在您的情况下为list_call
)。
不知何故,您需要将该变量提供给您的errback(cb_process_error
),方法是将其推送到cb_process_error
所在的类,通过其他用作伪全局的类或字面意思使用全局,然后只需在errback中调用list_call.stop()
。
由于我使用回调,因此我无法轻易捕获异常
这不是真的。处理异常的错误指向,这是导致它被调用的事情之一!查看我之前的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秒,直到反应堆关闭。