使用多处理控制Python中的进程数

时间:2014-06-03 16:29:54

标签: python multithreading process multiprocessing

我想控制使用多处理包时产生的进程数。

假设我只希望同时激活三个进程。我知道如何做到这一点的唯一方法是:

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()函数,即它没有“通过降压”

1 个答案:

答案 0 :(得分:1)

由于您似乎只有一个(并行)任务,而不是单独管理流程,因此您应该使用更高级别的multiprocessing.Pool,这样可以更轻松地管理流程数。

你不能join一个游泳池,但是你有执行此类任务的阻止调用(例如Pool.map)。

如果您需要更细粒度的控制,您可能需要调整Pool's source code