使用Pool的Python多处理以递归方式递送

时间:2016-08-22 12:09:55

标签: python pandas python-multiprocessing

我试图将我的熊猫计算中昂贵的一部分与加快速度相提并论。

我已经设法使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

当我运行此脚本时,会发生以下情况:

  1. 它读入数据。

  2. 它会在Pool语句之前进行所有计算和操作。

  3. 突然间它再次读入数据,四倍。

  4. 然后它同时进入主脚本四倍。

  5. 整个事情递归地落下并且变得混乱。

  6. 我之前已经读过,如果你不小心,这可能会发生,但我不知道为什么会发生这种情况。我的多处理代码受所需的name-main-statement(我在Win7 64上)保护,它只有4行,它有close和join语句,它调用一个定义的worker函数,然后调用第二个worker在循环中起作用,就是它。据我所知,它应该只创建具有四个进程的池,从导入的脚本调用四个进程,关闭池并等待一切都完成,然后继续使用脚本。在旁注中,我首先在同一个脚本中使用了worker函数,行为是相同的。它不是仅仅在池中执行任何操作,而是将整个脚本重新启动四倍。

    任何人都可以告诉我可能导致这种行为的原因是什么?我似乎缺少对Python的多处理行为的一些重要理解。

    此外,我不知道它是否重要,我是在我公司大型机上的虚拟机上。

    我是否必须使用单个进程而不是池?

1 个答案:

答案 0 :(得分:1)

我设法通过将整个脚本放入if __name__ == "__main__":语句而不仅仅是多处理部分来使其工作。