Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理:如何在池中添加或更改进程数_Python_Process_Multiprocessing_Pool - Fatal编程技术网

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

Python多处理:如何在池中添加或更改进程数,python,process,multiprocessing,pool,Python,Process,Multiprocessing,Pool,我已经从python多处理模块创建了一个池,并希望更改池中正在运行或添加的进程数。这可能吗?我尝试过类似的方法(代码的简化版本) 它似乎很有效,并最终实现了我想要的结果(即在多个流程之间分割工作),但我不确定这是最好的方法,或者它为什么有效。我认为这实际上不起作用: import multiprocessing, time def fn(x): print "running for", x time.sleep(5) if __name__ == "__main__":

我已经从python多处理模块创建了一个池,并希望更改池中正在运行或添加的进程数。这可能吗?我尝试过类似的方法(代码的简化版本)


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

我认为这实际上不起作用:

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.\u processes
)中,该变量在池实例化时设置。看

这似乎起作用的原因是进程数自动设置为当前计算机上的内核数,除非您指定不同的数目


我不确定您为什么要更改可用进程的数量——也许您可以更详细地解释一下。创建一个新的池非常容易,但只要您愿意(可能是在其他池运行完毕之后)。

您可以使用私有变量
\u processs
和私有方法
\u repopulate\u pool
。但我不建议使用私有变量等

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

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

我正在做一些自然语言生成,它的特殊应用要求我对我选择的单词进行大量过滤,如果只在一个进程上运行,这是非常缓慢的。我希望为每页要生成的每个段落运行一个流程(我一次生成一个页面),因此10页(每个页面有4-6个段落),每页需要运行4-6个流程。我想我希望Pool能为我完成的流程做“垃圾收集”,我可以为我创建的每个段落创建一个新的垃圾收集。虽然我想我可能已经错过了多处理的要点。你可以创建一个池,提交任意多个作业。如果作业数多于进程数,则它将只在计算机上有可用内核的情况下同时运行相同数量的进程。所有的工作都将完成,您将获得大约n倍的加速,其中n是您机器上的内核数。您不太可能获得大于n的加速,尽管我认为这是可能的,这取决于您的进程的速率限制部分。
pool = multiprocessing.Pool(processes=1, initializer=start_process)
>Starting ForkPoolWorker-35

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