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

sdi*_*ert 5 python pool process multiprocessing

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

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

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

Noa*_*oah 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))
Run Code Online (Sandbox Code Playgroud)

multiprocessing.Pool将进程数存储在私有变量(即Pool._processes)中,该变量在实例化 Pool 时设置。查看源代码

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

我不确定您为什么要更改可用进程的数量——也许您可以更详细地解释这一点。无论何时(大概是在其他池完成运行之后),创建新池都非常容易。

  • 您可以创建一个池并提交任意数量的作业。如果作业数量多于进程数量,则它只会同时运行与计算机上可用核心数量相同的进程。所有工作都将完成,您将获得大约 n 倍的加速,其中 n 是计算机上的核心数量。尽管我认为这可能取决于进程的速率限制部分,但您不太可能获得大于 n 的加速。 (2认同)