twisted loopingcall没有调用errback

时间:2012-10-26 16:07:23

标签: python asynchronous twisted

我一直在编写一些Twisted服务器并创建了一个定期运行的WatchDog计时器。它的默认行为是检查它是否在其计划的某个时间段内被调用,这有助于报告程序是否被过度阻止。它还为WatchDog的用户定义的回调函数提供了一种方法,可用于检查系统其他部分的运行状况。 WatchDog计时器使用twisted.internet.task.LoopingCall实现。我担心如果用户定义的函数创建一个异常,WatchDog定时器将停止被调用。我在代码中有异常处理,但我想有办法重新启动WatchDog计时器,如果它仍然设法崩溃。但是,我不明白如何使用LoopingCall()。start()方法返回的延迟。这里有一些示例代码来说明我的意思:

import sys
from twisted.internet import reactor, defer, task
from twisted.python import log

def periodic_task():
    log.msg("periodic task running")
    x = 10 / 0

def periodic_task_crashed():
    log.msg("periodic_task broken")

log.startLogging(sys.stdout)

my_task = task.LoopingCall(periodic_task)
d = my_task.start(1)
d.addErrback(periodic_task_crashed)
reactor.run()

当我运行此代码时,我会从periodic_task()函数中获得一个“定期任务运行”消息,就是这样。 my_task.start(1)返回的延迟从来没有调用它的errback,通过我阅读文档是应该发生的。

有人可以帮助我并指出我做错了吗?

提前致谢! 道格

1 个答案:

答案 0 :(得分:2)

periodic_task_crashed的签名是错误的。这是Deferred上的错误回调,因此将使用参数调用它,Failure表示Deferred得到的错误结果。由于它被定义为不带参数,因此调用它会产生TypeError,这将成为Deferred的新错误结果。

像这样重新定义:

def periodic_task_crashed(reason):
    log.err(reason, "periodic_task broken")