我正在使用前面提到的代码解决方案here。
我是装饰设计师的新手,如果我想写如下内容,我不明白为什么这个解决方案不起作用:
@timeout(10)
def main_func():
nested_func()
while True:
continue
@timeout(5)
def nested_func():
print "finished doing nothing"
=>;此操作的结果根本不会超时。我们将陷入无休止的循环。
但是,如果从nested_func
中删除@timeout
注释,则会出现超时错误。
由于某些原因,我们不能同时在函数和嵌套函数上使用decorator,不管我为什么以及如何更正它,假设包含函数的超时值总是大于嵌套超时值。
Python的PyPI库中有一个更好的timeout decorator版本。它同时支持基于UNIX和非基于UNIX的操作系统。提到信号的部分—特别是针对UNIX的部分。
假设您没有使用UNIX。下面是装饰程序中的代码片段,它显示了一个参数列表,您可以根据需要使用这些参数。
用于在非UNIX基本操作系统上实现。这就是我要做的:
如果你注意到了,我正在做使用'u signals=False。仅此而已,你该走了。
这是
signal
模块的计时函数的一个限制,您链接的decorator使用这些函数。这是相关的piece of the documentation(我加上了重点):所以,您看到的是,当调用
nested_func
时,它的计时器会取消外部函数的计时器。您可以更新decorator以注意
alarm
调用的返回值(这将是上一个警报(如果有的话)到期之前的时间)。正确地获取细节有点复杂,因为内部计时器需要跟踪其函数运行的时间,因此它可以修改前一个计时器上剩余的时间。这里有一个未经测试的decorator版本,我认为它基本上是正确的(但我不完全确定它是否适用于所有异常情况):正如Blckknght所指出的,不能为嵌套的装饰器使用信号,但是可以使用多处理器来存档。
您可以使用这个decorator,它支持嵌套的decorators:https://github.com/bitranox/wrapt_timeout_decorator
正如abager1999在他的博客中指出的那样https://anonbadger.wordpress.com/2018/12/15/python-signal-handlers-and-exceptions/ 使用信号和TimeoutException可能不是最好的主意——因为它可以在修饰函数中被捕获。
当然,您可以使用自己的异常(派生自基本异常类),但代码可能仍然无法按预期工作- 请看下一个示例-您可以在jupyter中试用:https://mybinder.org/v2/gh/bitranox/wrapt_timeout_decorator/master?filepath=jupyter_test_wrapt_timeout_decorator.ipynb
相关问题 更多 >
编程相关推荐