使用Python多处理处理每个工作程序超时

时间:2016-02-01 16:54:30

标签: python python-2.7 parallel-processing multiprocessing

我在使用Python的多处理模块时遇到了一些麻烦。我需要测试具有不同参数的函数,并且由于该函数进行了大量计算,因此最需要使用所有核心。我最终使用了适合我需要的pool.map()。问题是有时候我的函数永远不会结束,所以pool.map会永远阻塞,期望返回值。我不知道为什么会这样。我在没有使用多处理的情况下做了很多测试,只是在for循环中传递了一个又一个的argumment,它总是结束。

无论如何,我现在要做的是为每个worker /执行函数指定一个超时,但是如果达到超时,我需要在函数内部返回一个变量。这就像超时发生前函数的状态。我的代码太大了,不能在这里发布,但这是一个简单的,相当的例子:

def func(x):
    secsPassed = 0
    for _ in xrange(x):
        time.sleep(1)
        secsPassed +=1

    return secsPassed

pool = Pool(4)
results = pool.map(func, [3, 10, 50, 20, 300])

所以我希望每次执行都需要最多30秒,而且我也想知道在func被干扰之前secsPassed的值。我使用的是Python 2.7,我可以对func进行更改,或者在必要时使用除Pool.map之外的其他工具。

提前致谢。

1 个答案:

答案 0 :(得分:0)

This question has been asked several times in the past.

multiprocessing.Pool并非针对此类用例而设计。

强迫其中一名工人自杀将导致未定义的行为,这可能会因为永远停留在那里而导致程序崩溃。

有些库可以解决您的问题。 pebble允许您为工作人员设置超时,并在超过时间限制时停止工作。