gpt4 book ai didi

python - 扭曲的循环调用不调用 errback

转载 作者:行者123 更新时间:2023-11-28 17:49:23 26 4
gpt4 key购买 nike

我一直在编写一些 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) 返回的 deferred 从未调用过 errback,根据我对文档的阅读,这是应该发生的。

谁能帮我指出我做错了什么?

提前致谢!道格

最佳答案

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

像这样重新定义它:

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

关于python - 扭曲的循环调用不调用 errback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13090492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com