要结束task.LoopingCall
你需要做的就是调用stop
返回对象(list_call
在你的情况下)。
您需要以某种方式使该 var 可用于您的 errback ( cb_process_error
),方法是通过将其推入一个类cb_process_error
中,通过用作伪全局的其他类或通过字面上使用全局,然后您只需list_call.stop()
在 errback 内部调用。
顺便说一句,你说:
由于我正在使用回调,因此我无法轻松捕获异常
那不是真的。处理异常的 errback 的意义在于,这就是导致它被调用的原因之一!查看我之前的延迟答案,看看它是否使错误返回更清晰。
以下是一个可运行的示例(......我并不是说这是最好的方法,只是它是一种方法......)
#!/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 打印输出(这也将关闭loopingcall) 并等待 10 秒,直到反应堆关闭。