Python多进程:如何在池中添加或更改进程数量

5
我已经从Python的multiprocessing模块创建了一个进程池,并且想要更改进程池中运行进程的数量或者添加进程。这是可能的吗?我已经尝试过类似以下简化版代码的方式:
class foo:
    def __init__():
        self.pool = Pool()
    def bar(self, x):
        self.pool.processes = x
        return self.pool.map(somefunction, list_of_args)

看起来这个方法可以实现我想要的目的,即在多个进程之间分配工作,但我不确定这是否是最好的方法,或者为什么能够实现。

2个回答

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),该变量在实例化 Pool 时设置。请查看源代码

这似乎是工作正常的原因是,除非您指定不同的数量,否则进程数会自动设置为当前计算机上的核心数。

我不确定为什么您想要更改可用进程的数量--也许您可以详细解释一下。不过,每当您需要时(可能是在其他池运行完成后),创建新池非常容易。


我正在进行一些自然语言生成的工作,特别应用需要我对选择的单词进行大量过滤,如果仅在一个进程上运行,速度非常慢。我希望为每个页面生成所需的段落运行一个进程(我一次生成一页),因此10页每页4-6个段落需要每页运行4-6个进程。 我想Pool可以在完成进程后为我执行“垃圾回收”,然后我可以为创建的每个段落创建一个新进程。虽然我认为我可能错过了使用多进程的要点。 - sdiemert
2
您可以创建一个单一的池并提交任意数量的作业。如果作业数量超过进程数,则仅会同时运行与机器上可用核心数量相同的进程。所有作业都将完成,并且您将获得大约n倍的加速,其中n是您机器上的核心数。您不太可能获得大于n的加速,尽管我认为这取决于您的过程中限制速率的部分。 - Noah

1
您可以使用私有变量_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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接