我正在使用 这里 提到的代码解决方案。
我是装饰器的新手,不明白为什么如果我想写如下内容,这个解决方案不起作用:
@timeout(10)
def main_func():
nested_func()
while True:
continue
@timeout(5)
def nested_func():
print "finished doing nothing"
=> 结果根本不会超时。我们将陷入无限循环。
但是,如果我从 nested_func
中删除 @timeout
注释,我会收到超时错误。
出于某种原因,我们不能同时在函数和嵌套函数上使用装饰器,任何想法为什么以及如何纠正它才能工作,假设包含函数超时总是必须大于嵌套超时。
原文由 JavaSa 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是
signal
模块的计时功能的限制,您链接的装饰器使用该功能。这 是文档的相关部分(我添加了重点):所以,你看到的是当你的
nested_func
被调用时,它的定时器取消了外部函数的定时器。您可以更新装饰器以注意
alarm
调用的返回值(这将是上一个警报(如果有)到期之前的时间)。要获得正确的细节有点复杂,因为内部计时器需要跟踪其功能运行了多长时间,因此它可以修改前一个计时器的剩余时间。这是一个未经测试的装饰器版本,我认为它基本上是正确的(但我不完全确定它对所有异常情况都能正常工作):