3

我一直在编写一些 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()

当我运行此代码时,我从 period_task() 函数中收到一条“正在运行的定期任务”消息,仅此而已。my_task.start(1) 返回的 deferred 永远不会被调用 errback,通过我阅读文档,这是应该发生的。

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

提前致谢!道格

4

1 回答 1

3

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

像这样重新定义它:

def periodic_task_crashed(reason):
    log.err(reason, "periodic_task broken")
于 2012-10-26T19:06:33.490 回答