加入一组超时的python进程

时间:2014-05-15 19:20:42

标签: python multiprocessing

我使用python的多处理库来创建多个进程。

from multiprocessing import Process
processes = [Process(target=function) for function in FUNCTIONS]
for p in processes:
    p.start()

我希望它们运行一段时间,然后如果它们还没有完成,则终止它们。

DURATION = 3600

执行此操作的一种不好的方法如下(不好,因为如果进程比DURATION快,它仍然等待所有DURATION):

from time import sleep
sleep(duration)
for p in processes:
    p.join(0)
    p.terminate()

另一种不好的方法(不好因为它可能需要N * DURATION才能完成,其中N是进程数):

for p in processes:
    p.join(DURATION)
    p.terminate()

这样做的好方法是什么?

3 个答案:

答案 0 :(得分:2)

我相信这可以做到你想要的,不需要任何轮询,它只会等到你指定的DURATION。

time_waited = 0
then = time.time()
for p in processes:
    if time_waited >= DURATION:
        p.join(0)
        p.terminate()
    p.join(DURATION - time_waited)
    time_waited = time.time() - then

答案 1 :(得分:0)

这将每秒轮询所有进程是否完成,直到DURATION。如果所有进程都已完成或DURATION已发生,则它会加入/终止所有进程。它并不完美,因为它在for循环的每次迭代中需要稍长于一秒,但它会非常接近。

from time import sleep
for _ in range(DURATION):
    if not any(i.is_alive() for i in processes): break
    sleep(1)
for p in processes:
    p.join(0)
    p.terminate()

答案 2 :(得分:0)

最简单的事情可能是拥有一个"主人" join(0)所有进程然后退出的线程,并使主线程join(3600)成为主线程。

def wait_func():
    for p in processes:
    p.join()

wait_process = Process(target=wait_func)
wait_process.start()
wait_process.join(DURATION)
for p in processes:
    p.terminate()