我想控制使用多处理包时产生的进程数。
假设我只希望同时激活三个进程。我知道如何做到这一点的唯一方法是:
import multiprocessing
import Queue
def worker(arg):
## Do stuff
return returnvalue
argument = list(1,2,3,4,5,6)
aliveprocesses = 0
jobs = Queue.Queue()
for arg in argument:
while jobs.qsize() > 2:
jobs.get().join()
p = multiprocessing.Process(target=worker,args=(arg,))
jobs.put(p)
p.start()
基本上我只知道如何使用Process.join()函数一次监控一个进程。我监视最旧的进程,直到完成,然后创建一个新进程。对于我的程序,最老的过程平均应该先完成其他过程。但谁知道呢?也许另一个过程首先结束,我无法知道。
我能想到的唯一选择是:
import multiprocessing
import time
def worker(arg):
## Do stuff
return returnvalue
argument = list(1,2,3,4,5,6)
aliveprocesses = 0
jobs = set()
for arg in argument:
while aliveprocesses > 2:
for j in jobs:
if not j.is_alive():
aliveprocesses -= 1
break
time.sleep(1)
p = multiprocessing.Process(target=worker,args=(arg,))
jobs.put(p)
p.start()
aliveprocesses += 1
在上面的函数中,如果它们仍然存在,则检查所有进程。如果他们都还活着,你会睡一会儿,然后再检查,直到有一个死的过程,之后你会产生一个新的过程。这里的问题是,根据我的理解,time.sleep()函数不是一个等待进程结束的特别有效的方法。
理想情况下,我希望函数“superjoin()”像Process.join()只使用一组Process对象,当集合中的一个Process返回时,superjoin()返回。 而superjoin()本身并没有使用time.sleep()函数,即它没有“通过降压”
答案 0 :(得分:1)
由于您似乎只有一个(并行)任务,而不是单独管理流程,因此您应该使用更高级别的multiprocessing.Pool,这样可以更轻松地管理流程数。
你不能join
一个游泳池,但是你有执行此类任务的阻止调用(例如Pool.map
)。
如果您需要更细粒度的控制,您可能需要调整Pool's source code