3

我是 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()
4

1 回答 1

4

要结束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 秒,直到反应堆关闭。

于 2014-05-24T17:01:58.353 回答