python - 如何为使用多处理的函数设置超时?
问题描述
我有一个multiprocessing.pool
用于执行一些繁重计算的函数(用 建模sleep(5)
),如果需要的时间太长,我希望有一个超时来结束这个计算,并提前关闭池。
def add_const(number, const):
print('Adding', const,'to', number)
time.sleep(5)
return number+const
def function_parallel(list_of_numbers, const):
pool = Pool(2)
data=pool.imap(functools.partial(add_const, const=const), list_of_numbers)
pool.close()
pool.join()
return(data)
我尝试使用stopit
模块(https://pypi.org/project/stopit/),但它没有用。
t1 = time.time()
with stopit.ThreadingTimeout(2) as to_ctx_mgr:
assert to_ctx_mgr.state == to_ctx_mgr.EXECUTING
result=[]
data=function_parallel([1, 2], 2)
for i in data:
result.append(i)
if to_ctx_mgr.state == to_ctx_mgr.TIMED_OUT:
result.append('timeout')
print(result)
print(time.time()-t1)
在其中map
,function_parallel
它花了整整 5 秒而不是在 2 秒后停止,而且它还留下了僵尸进程。imap
计算被冻结并且不得不被迫停止,所以更糟。
是否有一种安全可靠的方法可以使此功能超时?谢谢!
编辑:
不幸的是pebble
,我无法解决我的问题。它允许为每次调用设置超时,add_const
并且我需要为整个池设置一个超时(例如,如果有一百万个调用,每个调用都很短,但它们加起来会花费很多时间)。
更重要的是,一般来说,我想超时一些非常大的部分代码,包括池(有时超时甚至可能发生在池之前),但似乎没有解决方案......
解决方案
推荐阅读
- optimization - 八度:quadprog 索引问题?
- c++ - 使用带有自动声明的 lambdas 与就地?
- c# - 动态加载 XAML 控件时无法创建未知类型“画布”
- javascript - 同位素多级过滤不起作用
- python - 使用 python 和 beautifulsoup 对 Google Ads 进行网页抓取
- java - 我不知道为什么我的下一个 If 语句只是我最后的手段!JAVA
- c# - 后台线程和对话框
- php - 使用 PHP 和 Amazon AWS EC2 的会话
- powershell - Powershell 脚本审核远程桌面用户登录
- google-apps-script - Google App Script - 如果单元格与字符串中的条件匹配,则更改单元格的颜色