Python多处理:如何添加或更改池中的进程数

时间:2012-04-04 17:22:45

标签: python process multiprocessing pool

我已经从python多处理模块创建了一个池,并希望更改池已运行或添加到它们的进程数。这可能吗?我试过这样的东西(我的代码的简化版)

class foo:
    def __init__():
        self.pool = Pool()
    def bar(self, x):
        self.pool.processes = x
        return self.pool.map(somefunction, list_of_args)

它似乎工作并实现了我最终想要的结果(这是在多个进程之间分割工作)但我不确定这是最好的方法,或者为什么它工作。

2 个答案:

答案 0 :(得分:2)

我不认为这确实有效:

import multiprocessing, time

def fn(x):
    print "running for", x
    time.sleep(5)

if __name__ == "__main__":
    pool = multiprocessing.Pool()
    pool.processes = 2

    # runs with number of cores available (8 on my machine)
    pool.map(fn, range(10))

    # still runs with number of cores available, not 10
    pool.processes = 10
    pool.map(fn, range(10))

multiprocessing.Pool存储私有变量(即Pool._processes)中的进程数,该变量在实例化池时设置。请参阅source code

这看起来有效的原因是因为除非您指定不同的数字,否则进程数会自动设置为当前计算机上的核心数。

我不确定您为什么要更改可用的进程数量 - 也许您可以更详细地解释这一点。可以随时随地创建一个新池(大概是在其他池完成运行之后)。

答案 1 :(得分:0)

您可以使用私有变量_processes和私有方法_repopulate_pool。但我不建议使用私有变量等。

pool = multiprocessing.Pool(processes=1, initializer=start_process)
>Starting ForkPoolWorker-35

pool._processes = 3
pool._repopulate_pool()
>Starting ForkPoolWorker-36
>Starting ForkPoolWorker-37