在 Windows 上设置超时限制
Setting timeout limit on Windows
我有一个功能应该不会花太长时间 运行。我想对其设置超时限制。我可以在互联网上找到一个建议的解决方案。请参阅以下 SO post。 Timeout on a function call
该解决方案使用信号,Windows 上不可用。有一个类似的用于制作代码的信号,它有一个 windows 端口,如本 SO post 所解释的:python: windows equivalent of SIGALRM 这不是直接对超时的回答,但可能是适应超时工作。不过它是为 python 2.7 编写的。
由于答案大约有 10 年历史,我的问题是:是否有更现代的 python(例如 python 3.7)方法来创建上下文 manager/decorator/similar 包装器"normal function" 进入 windows 系统上的超时限制函数?
这是一种将@Praveenkumar 的 转换为 easy-to-use 装饰器的方法,您现在似乎想知道:
import time
import concurrent.futures as futures
def timeout(timelimit):
def decorator(func):
def decorated(*args, **kwargs):
with futures.ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(func, *args, **kwargs)
try:
result = future.result(timelimit)
except futures.TimeoutError:
print('Timedout!')
raise TimeoutError from None
else:
print(result)
executor._threads.clear()
futures.thread._threads_queues.clear()
return result
return decorated
return decorator
@timeout(3)
def test(n):
print(f'Sleeping for {n} seconds')
time.sleep(n)
# Real code here.
return 'Done'
test(2) # OK
test(5) # -> Causes timeout.
我有一个功能应该不会花太长时间 运行。我想对其设置超时限制。我可以在互联网上找到一个建议的解决方案。请参阅以下 SO post。 Timeout on a function call
该解决方案使用信号,Windows 上不可用。有一个类似的用于制作代码的信号,它有一个 windows 端口,如本 SO post 所解释的:python: windows equivalent of SIGALRM 这不是直接对超时的回答,但可能是适应超时工作。不过它是为 python 2.7 编写的。
由于答案大约有 10 年历史,我的问题是:是否有更现代的 python(例如 python 3.7)方法来创建上下文 manager/decorator/similar 包装器"normal function" 进入 windows 系统上的超时限制函数?
这是一种将@Praveenkumar 的
import time
import concurrent.futures as futures
def timeout(timelimit):
def decorator(func):
def decorated(*args, **kwargs):
with futures.ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(func, *args, **kwargs)
try:
result = future.result(timelimit)
except futures.TimeoutError:
print('Timedout!')
raise TimeoutError from None
else:
print(result)
executor._threads.clear()
futures.thread._threads_queues.clear()
return result
return decorated
return decorator
@timeout(3)
def test(n):
print(f'Sleeping for {n} seconds')
time.sleep(n)
# Real code here.
return 'Done'
test(2) # OK
test(5) # -> Causes timeout.