python - 任何实际有效的 concurrent.futures 超时?
问题描述
试图以便宜的方式编写基于进程的超时(同步),如下所示:
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)
但似乎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 秒。
相关问题展示了如何使用线程池或使用信号来做到这一点。如何在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()
推荐阅读
- excel - 如何获取将数据从 sheet2 复制到 sheet1 的代码?
- java - 如何使用 Selenium 获取元素标签的请求
- html - Soundcloud iframe 实现到 bootstrap4 问题
- sorbet - 关于冰糕设置的问题:如何消除步骤 4 中的错误
- ruby-on-rails - 在 Rails ActiveRecord 中按条件使用“includes”,没有外键
- angular - Angular 项目不会重定向到 index.html
- spring - Spring MVC 为返回视图的服务层编写单元测试
- r - 如何评估 R 中数据表中布尔列函数的代码?
- matlab - MATLAB:许多矩阵求逆速度更快
- java - 基于事件时间的窗口不触发