首页 > 解决方案 > 如何为使用多处理的函数设置超时?

问题描述

我有一个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)

在其中mapfunction_parallel它花了整整 5 秒而不是在 2 秒后停止,而且它还留下了僵尸进程。imap计算被冻结并且不得不被迫停止,所以更糟。

是否有一种安全可靠的方法可以使此功能超时?谢谢!

编辑:

不幸的是pebble,我无法解决我的问题。它允许为每次调用设置超时,add_const并且我需要为整个池设置一个超时(例如,如果有一百万个调用,每个调用都很短,但它们加起来会花费很多时间)。

更重要的是,一般来说,我想超时一些非常大的部分代码,包括池(有时超时甚至可能发生在池之前),但似乎没有解决方案......

标签: pythonmultiprocessingtimeout

解决方案


推荐阅读