我在过去几天提交了几个问题,试图了解如何正确使用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
正如我所说的,上面的函数是一个非常小的列表,但是进行它的函数会处理一个更大的列表。
答案 0 :(得分:2)
问题是您在每次调用worker函数时似乎没有做足够的工作。你似乎正在做的就是将作为参数传递的字符串列表粘贴在一起。但是,这正是多处理模块在父进程中需要执行的操作,以将字符串列表传递给工作进程。它将它们腌制,将它们写入管道,然后子进程读取,取消分解,然后作为参数传递给myFunction
。
因为为了将参数传递给工作进程,父进程必须至少完成工作进程需要做的工作,所以在这种情况下使用多处理模块没有任何好处。
答案 1 :(得分:0)
因为我没有足够的声誉点来评论或提出这个问题..我写的是答案..
罗斯给出的答案是一个完美的解释。我遇到了类似的问题,在使用'top'时,我几乎可以看到所有生成的进程处于“休眠”状态。这是因为他们正在忙着腌制我传递的一个非常大的数据结构。我把这个结构全局化,看看是不是这样,一旦我这样做,加速就回来了!
很好找到Ross和sidewaiise!