我是 Twisted 的新手,在最终弄清楚延迟的工作原理后,我正在为这些任务而苦苦挣扎。我想要实现的是拥有一个在循环中发送 REST 请求的脚本,但是如果在某个时候它失败了,我想停止循环。由于我使用的是回调,所以我无法轻易捕获异常,而且因为我不知道如何停止 errback 的循环,所以我被卡住了。
这是我的代码的简化版本:
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()
最佳答案
要结束task.LoopingCall
,您需要做的就是在返回对象上调用stop
(在您的例子中为list_call
)。
您需要以某种方式使您的 errback (cb_process_error
) 可以使用该 var伪全局或字面上使用全局,然后您只需在 errback 中调用 list_call.stop()
。
顺便说一句,你说:
Since I'm using callbacks I can't easily catch exceptions
事实并非如此。 errback 的意义在于处理异常,这就是真正导致它被调用的原因之一!查看我之前的 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
这将获取页面 10 秒,如果您将 agent.request
的第二个参数更改为 http://127.0.0.1:12999
(假设端口 12999 会拒绝连接)然后你会看到 1 errback 打印输出(这也会关闭循环调用)并等待 10 秒直到 react 堆关闭。
关于python - 如果发生异常则停止 task.LoopingCall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23847185/