python – 任何concurrent.futures超时实际上有效吗?
作者:互联网
试图以便宜的方式编写基于进程的超时(sync),如下所示:
from concurrent.futures import ProcessPoolExecutor
def call_with_timeout(func, *args, timeout=3):
with ProcessPoolExecutor(max_workers=1) as pool:
future = pool.submit(func, *args)
result = future.result(timeout=timeout)
但似乎传递给future.result的超时参数并不像宣传的那样真正起作用.
>>> t0 = time.time()
... call_with_timeout(time.sleep, 2, timeout=3)
... delta = time.time() - t0
... print('wall time:', delta)
wall time: 2.016767978668213
好.
>>> t0 = time.time()
... call_with_timeout(time.sleep, 5, timeout=3)
... delta = time.time() - t0
... print('wall time:', delta)
# TimeoutError
不行 – 5秒后解锁,而不是3秒.
相关问题显示如何使用线程池或使用signal执行此操作.如何在n秒后超时提交到池的进程,而不使用任何多处理的_private API?硬杀是好的,不需要请求干净的关机.
解决方法:
你可能想看看pebble
.
它的ProcessPool旨在解决这个问题:启用超时和取消正在运行的任务,而无需关闭整个池.
当未来超时或被取消时,工作人员实际上终止有效地停止执行预定功能.
超时:
pool = pebble.ProcessPool(max_workers=1)
future = pool.schedule(func, args=args, timeout=1)
try:
future.result()
except TimeoutError:
print("Timeout")
例:
def call_with_timeout(func, *args, timeout=3):
pool = pebble.ProcessPool(max_workers=1)
with pool:
future = pool.schedule(func, args=args, timeout=timeout)
return future.result()
标签:python,timeout,multiprocessing,concurrent-futures 来源: https://codeday.me/bug/20190701/1345806.html