我想使用一个进程池运行一些作业,并应用一个给定的超时,之后应该杀死一个作业,并替换另一个处理下一个任务的作业.
我曾尝试使用多处理模块,它提供了一种异步运行工作池的方法(例如使用map_async),但在那里我只能设置一个“全局”超时,之后所有进程都将被终止.
是否有可能有一个单独的超时,之后只有一个耗时太长的进程被杀死,而一个新的worker再次被添加到池中(处理下一个任务并跳过超时的那个)?
这是一个简单的例子来说明我的问题:
def Check(n):
import time
if n % 2 == 0: # select some (arbitrary) subset of processes
print "%d timeout" % n
while 1:
# loop forever to simulate some process getting stuck
pass
print "%d done" % n
return 0
from multiprocessing import Pool
pool = Pool(processes=4)
result = pool.map_async(Check, range(10))
print result.get(timeout=1)
超时后,所有工人都被杀死,程序退出.我想继续下一个子任务.我是否必须自己实施此行为或是否存在现有解决方案?
更新
可以杀死悬挂的工人,他们会自动更换.所以我提出了这个代码:
jobs = pool.map_async(Check, range(10))
while 1:
try:
print "Waiting for result"
result = jobs.get(timeout=1)
break # all clear
except multiprocessing.TimeoutError:
# kill all processes
for c in multiprocessing.active_children():
c.terminate()
print result
现在的问题是循环永远不会退出;即使在处理完所有任务之后,调用get也会产生超时异常.