如何从多处理池中终止AsyncResult?

时间:2016-02-23 18:22:56

标签: python multiprocessing pool

我有一个简单的代码,如下所示。第一个进程阻止队列,因此没有一个完成。

如果超过.get()超时,我希望能够杀死AsyncResult,这样我的池队列就可以继续了。 但是,在没有修改“myfunc”的情况下,我找不到任何简单的方法。有谁知道如何实现这一目标?

import multiprocessing
import time


def myf(x):
    if x == 0:
        time.sleep(100)
    else:
        time.sleep(2)
    return 'done'


pool = multiprocessing.Pool(processes=1)
results = []
for x in range(8):        
  results.append(pool.apply_async(myf,args=[x]))
pool.close()

for res in results:
    try:
      print res.get(3)
    except Exception as e:
      print 'time out'

1 个答案:

答案 0 :(得分:4)

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

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

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

Similar question asked previously.