使用multiprocessing控制Python中的进程数量

1 投票
1 回答
538 浏览
提问于 2025-04-18 08:26

我想控制在使用多进程包时同时运行的进程数量。

比如说,我只想让三个进程同时活跃。我知道的唯一方法是:

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(),但它可以处理一组进程对象,当其中一个进程完成时,superjoin()也就返回了。而且superjoin()本身不使用time.sleep()函数,也就是说,它不是在“推卸责任”。

1 个回答

1

看起来你只有一个(并行)任务,所以与其单独管理每个进程,不如使用更高级的 multiprocessing.Pool,这样可以更轻松地管理进程的数量。

你不能对一个池进行 join 操作,但你可以使用一些阻塞调用(比如 Pool.map),这些调用可以完成这类任务。

如果你需要更细致的控制,可以考虑修改 Pool的源代码

撰写回答