给一组Python进程设置超时连接
我正在使用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