【发布时间】:2015-07-06 20:35:16
【问题描述】:
我需要运行多个进程,但不是一起运行,例如同时运行 4 个进程。 multiprocessing.Pool 正是我所需要的。但问题是,如果进程持续时间超过超时(例如 3 秒),我需要终止进程。 Pool 只支持等待所有进程的超时,而不是每个进程。这就是我需要的:
def f():
process_but_kill_if_it_takes_more_than_3_sec()
pool.map(f, inputs)
我找不到一个简单的方法来使用 Pool 超时。有来自 Eli Bendersky 的a solution。这是一个通过Thread.join(timeout) 限制任意函数执行时间的函数。它有效,(尽管它的停止方法效果不佳)。但是这个方法在进程的主线程等待时运行了一个新的不必要的线程,因为我们需要一个超时控制器。应该可以从一个点控制所有超时,如下所示:
import time
from multiprocessing import Process
def f(n):
time.sleep(n)
timeout = 3
tasks = [1, 2, 4, 1, 8, 2]
procs = []
pool_len = 4
while len(tasks) > 0 or len(procs) > 0:
if len(tasks) > 0 and len(procs) < pool_len:
n = tasks.pop(0)
p = Process(target=f, args=(n,))
p.start()
procs.append({'n': n, 'p': p, 't': time.time() + timeout})
for d in procs:
if not d['p'].is_alive():
procs.remove(d)
print '%s finished' % d['n']
elif d['t'] < time.time():
d['p'].terminate()
procs.remove(d)
print '%s killed' % d['n']
time.sleep(0.05)
输出应该是:
1 finished
1 finished
2 finished
4 killed
2 finished
8 killed
问题:有没有办法使用 Pool 来解决这个问题?
【问题讨论】:
标签: python timeout multiprocessing pool