我想创建自己的进程池,例如:
from multiprocessing import Process
import time
NB_PROCESS = 10
procs = set()
def do_job(args):
*** some processing ***
if __name__ == '__main__':
while True:
for p in list(procs):
if p.is_alive():
print(f'Proc {p.pid} running...')
else:
print(f'Proc {p.pid} terminated')
procs.remove(p)
for i in range(NB_PROCESS-len(procs)):
job_args=get_job_from_db()
if job_args:
p = Process(target=do_job, args=(job_args,))
p.start()
procs.add(p)
time.sleep(1)
我希望始终有10个进程在运行:我想在一个(不是全部)进程终止后立即启动另一个进程。
实际上,我使用.is_alive()
编写了一个主动等待,但我发现这根本不干净。
请注意,我无法使用队列,因为我需要等待最后一刻来决定要运行的作业。
我无法使用python multiprocessing.Pool
,因为Pool.join()
将等待所有作业终止。就我而言,我想知道一个工人在做apply_async()
之前是否有空,我看不到有任何方法可以做到这一点
在运行MySQL事务时,无法将job_args=get_job_from_db()
放在do_job()
中:每个工作人员可能会获得相同的工作(并发问题)
如何继续等待直到池中的一个进程终止?