我试图将我的熊猫计算中昂贵的一部分与加快速度相提并论。
我已经设法使Multiprocessing.Pool工作了一个简单的例子:
import multiprocessing as mpr
import numpy as np
def Test(l):
for i in range(len(l)):
l[i] = i**2
return l
t = list(np.arange(100))
L = [t,t,t,t]
if __name__ == "__main__":
pool = mpr.Pool(processes=4)
E = pool.map(Test,L)
pool.close()
pool.join()
这里没问题。现在我自己的算法有点复杂,我无法在这里发布它的全部荣耀和可怕,所以我会使用一些伪代码来概述我在那里做的事情:< / p>
import pandas as pd
import time
import datetime as dt
import multiprocessing as mpr
import MPFunctions as mpf --> self-written worker functions that get called for the multiprocessing
import ClassGetDataFrames as gd --> self-written class that reads in all the data and puts it into dataframes
=== Settings
=== Use ClassGetDataFrames to get data
=== Lots of single-thread calculations and manipulations on the dataframe
=== Cut dataframe into 4 evenly big chunks, make list of them called DDC
if __name__ == "__main__":
pool = mpr.Pool(processes=4)
LLT = pool.map(mpf.processChunks,DDC)
pool.close()
pool.join()
=== Join processed Chunks LLT back into one dataframe
=== More calculations and manipulations
=== Data Output
当我运行此脚本时,会发生以下情况:
它读入数据。
它会在Pool语句之前进行所有计算和操作。
突然间它再次读入数据,四倍。
然后它同时进入主脚本四倍。
整个事情递归地落下并且变得混乱。
我之前已经读过,如果你不小心,这可能会发生,但我不知道为什么会发生这种情况。我的多处理代码受所需的name-main-statement(我在Win7 64上)保护,它只有4行,它有close和join语句,它调用一个定义的worker函数,然后调用第二个worker在循环中起作用,就是它。据我所知,它应该只创建具有四个进程的池,从导入的脚本调用四个进程,关闭池并等待一切都完成,然后继续使用脚本。在旁注中,我首先在同一个脚本中使用了worker函数,行为是相同的。它不是仅仅在池中执行任何操作,而是将整个脚本重新启动四倍。
任何人都可以告诉我可能导致这种行为的原因是什么?我似乎缺少对Python的多处理行为的一些重要理解。
此外,我不知道它是否重要,我是在我公司大型机上的虚拟机上。
我是否必须使用单个进程而不是池?
答案 0 :(得分:1)
我设法通过将整个脚本放入if __name__ == "__main__":
语句而不仅仅是多处理部分来使其工作。