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

标签 python twisted twisted.internet

我是 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/

相关文章:

python - 在 NumPy 中复制 Matlab 的 ISMEMBER 函数的索引结果?

Python - 为什么 `int(x, 2)` 只能用于字符串,不能用于整数?

python - 关于在工作节点上分发 python 数据/代码的建议?

使用 Twisted 的 Python 应用程序在用户注销 Windows XP 后停止运行

Python、optparse 和文件掩码

javascript - 将数据从一个 Django 应用程序发送到另一个应用程序时如何保持换行符

python - 扭曲忽略从 MUD 客户端发送的数据?

python - twisted defer 使类实例变量的赋值无效

python - 了解 Twisted 和异步编程。为什么一段代码有效而另一段代码无效?