Python';池生成新进程

Python';池生成新进程,python,multiprocessing,Python,Multiprocessing,我有一个关于多处理模块的简单问题。我正在使用multiprocessing.Pool的map()函数来加速本地机器上自写代码的执行。然而,这段代码是在一个迭代循环中运行的,我发现在我的机器中,循环的每次迭代都会产生额外的Python进程。(这是一个问题,因为系统缓慢地停止运转)。下面是一个简单的例子: from multiprocessing import Pool import os nthreads = 2 for ii in xrange(5): pool = Pool(proc

我有一个关于多处理模块的简单问题。我正在使用multiprocessing.Pool的
map()
函数来加速本地机器上自写代码的执行。然而,这段代码是在一个迭代循环中运行的,我发现在我的机器中,循环的每次迭代都会产生额外的Python进程。(这是一个问题,因为系统缓慢地停止运转)。下面是一个简单的例子:

from multiprocessing import Pool
import os

nthreads = 2
for ii in xrange(5):
    pool = Pool(processes=nthreads)  # (in my code, Pool is inside a pickleable function.)
    runningProcesses = os.popen('ps | grep ython').readlines()
    nproc = len(runningProcesses)
    print "After iteration %i there were %i Python processes running!" % (ii, nproc)
输出为:

After iteration 0 there were 5 Python processes running!
After iteration 1 there were 7 Python processes running!
After iteration 2 there were 9 Python processes running!
After iteration 3 there were 11 Python processes running!
After iteration 4 there were 13 Python processes running!

我应该如何安排代码以避免产生许多新的Python进程?我正在运行Python2.7.6,它有多处理v0.70a1,我在运行OSX 10.8.5的4核MacBook Pro上运行。

pool=pool(processs=nthreads)
放在
上面,用于
循环,正如注释中所讨论的那样-池中的工作进程没有关闭/连接,因此它们永远不会终止。此处的顶部答案显示了当您不再需要时如何清理池:


作为旁注,如果您正在创建大量工作人员并使用他们执行非常短/快速的作业,那么您可能会发现性能受到影响-操作系统在创建和销毁进程时会产生开销。如果是这样,那么您应该考虑在整个应用程序中使用单个池。

您正在不断迭代中创建一个新的多处理工作池。你想做的是在所有迭代中使用相同的N个工作人员池吗?汤姆:你的问题有点混乱,因为我是多道处理新手,我不知道你的意思。我唯一的目标是(1)能够使用多处理来加速我的(科学的、数据处理的)代码的执行,(2)不产生很多子进程。有什么想法吗?对不起,编辑得不好!您正在每个迭代中创建一个新的工作人员池。例如,在第二次迭代中,您拥有两个工作人员的原始池,然后再创建一个包含两个以上工作人员的新池。在第三次迭代中,您将创建另外两个工作人员的第三个池。是否要在所有迭代过程中使用相同的N个工作线程池?另一个问题可能是您没有。join()在完成池工作线程池工作线程后将其绑定?例如,请参见上面的答案:Tom:我对是否“使用相同的N个工人池”漠不关心——我只想停止子流程的不可阻挡的累积。在我的子函数中添加
pool.close()
,然后添加
pool.join()
,似乎可以实现这一点,所以这似乎就是我一直在寻找的解决方案。谢谢问题是对
Pool()
的调用发生在我的代码的函数中。每次执行该函数时,都会生成其他进程。或者你的意思是我应该在我的主脚本和各个子函数之间传递一个pool对象?@Kreuzfeld听起来你需要向我们展示更多的实际代码,这样我们就可以看到你的函数是如何被调用的,以及你对
pool
对象的实际操作。pool()不能在循环中,因为循环每次迭代都会创建新的工作线程。您需要在脚本使用循环启动任何操作之前放置Pool()。因此,如果您有一个执行次数超过一次的函数,您应该在该函数执行之前将Pool()放置在某个位置。Vizjerei,您的意思是我应该将Pool对象作为参数传递给我的函数吗?[池不能是“在脚本启动之前”,因为“在”脚本之前没有任何内容…在调用子函数之前,池必须在函数内或我的脚本中更早的地方初始化。]不是在主脚本之前,而是在要使用的函数上的循环之前。池()不能在任何循环中。如果您提供更多的代码,那么解释起来就更容易了。正如我前面提到的:在我的子函数中添加pool.close()和pool.join(),似乎可以阻止Python子进程的无休止的增殖,所以这似乎就是我一直在寻找的解决方案。谢谢