给一组Python进程设置超时连接

5 投票
3 回答
833 浏览
提问于 2025-04-18 06:42

我正在使用Python的多进程库来创建几个进程。

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

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

DURATION = 3600

一种不好的做法是这样的(不好的原因是如果进程在设定的时间内完成了,它仍然会等到设定的时间才结束):

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

最简单的方法可能是创建一个“主”线程,这个线程会等待所有其他进程完成后再退出。然后,主线程会等待这个“主”线程最多3600秒(也就是1小时)来确保它完成。

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()
0

这个代码每秒钟检查一次所有的进程是否完成,最多检查到设定的时间(DURATION)。如果所有的进程都结束了,或者时间到了,它就会结束所有的进程。虽然这个方法不是特别完美,因为在每次循环中可能会比一秒钟稍微多一点时间,但基本上是很接近一秒的。

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

我觉得这个方法可以满足你的需求,而且不需要轮询,它只会等待你指定的时间长度。

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

撰写回答