编程语言
首页 > 编程语言> > python – 任何concurrent.futures超时实际上有效吗?

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