pool.map()从多处理锁定进程自动进入CPU核心吗?

时间:2014-09-23 01:06:08

标签: python multithreading map multiprocessing

我在过去几天提交了几个问题,试图了解如何正确使用multiprocessing python库。

当前使用的方法是将任务分割为多个进程,这些进程等于计算机上可用CPU核心的数量,如下所示:

from multiprocessing import Pool
from contextlib import closing

def myFunction(row):
    # row function

with closing(Pool(processes=multiprocessing.cpu_count())) as pool:
    pool.map(myFunction, rowList)

然而,当在程序中到达地图部分时,它似乎实际上变慢了,而不是加速。例如,我的一个函数只移动了60个记录(第一个函数),并在每个记录的末尾打印一个结果。记录打印似乎放慢到最终停止并且不多!我想知道程序是否正在将下一个函数加载到内存异步中,或者我的方法是否有问题。

所以我想知道 - 孩子是否自动处理'已锁定'使用pool.map()到每个CPU内核还是需要做额外的事情?

编辑:

因此程序实际上并没有停止,它只是开始非常缓慢地打印值。

这是一个非常简化的myFunction示例(行来自列表对象):

def myFunction(row):
    d = string
    j=0
    for item in object:
        d+= row[j]
        j=j+1
    d += row[x] + string
    d += row[y] + string
    print row[z]
    return

正如我所说的,上面的函数是一个非常小的列表,但是进行它的函数会处理一个更大的列表。

2 个答案:

答案 0 :(得分:2)

问题是您在每次调用worker函数时似乎没有做足够的工作。你似乎正在做的就是将作为参数传递的字符串列表粘贴在一起。但是,这正是多处理模块在父进程中需要执行的操作,以将字符串列表传递给工作进程。它将它们腌制,将它们写入管道,然后子进程读取,取消分解,然后作为参数传递给myFunction

因为为了将参数传递给工作进程,父进程必须至少完成工作进程需要做的工作,所以在这种情况下使用多处理模块没有任何好处。

答案 1 :(得分:0)

因为我没有足够的声誉点来评论或提出这个问题..我写的是答案..

罗斯给出的答案是一个完美的解释。我遇到了类似的问题,在使用'top'时,我几乎可以看到所有生成的进程处于“休眠”状态。这是因为他们正在忙着腌制我传递的一个非常大的数据结构。我把这个结构全局化,看看是不是这样,一旦我这样做,加速就回来了!

很好找到Ross和sidewaiise!