多处理池正在为创建的每个进程运行整个代码,而不仅仅是传递给它的函数

时间:2019-06-17 08:41:20

标签: python python-multiprocessing

python代码执行数据提取和预处理(将数据转换为可迭代以使Pool Map运行),然后调用Pool Map自动对数据进行子集化并并行运行。但是,我发现除了应该在每个进程中运行的功能之外,数据提取和预处理也在每个进程中再次运行。

代码如下:

#Data Pull
orig_data= pd.read_csv(<fileath>)

#Data Preprocessing
start=time.time()
transformed_input=list() # transformed_input is populated with data from orig_data dataframe as required
end=time.time()
print("Preprocessing Time")
print(end-start)


def examplefunction(transformed_input_sub):
    # Required Function
    return output

if __name__ == '__main__':
    from multiprocessing import Pool
    p=Pool()
    s=time.time()
    output=p.map(examplefunction,transformed_input)
    p.close()
    p.join()
    e=time.time()
    print("Time Taken")  
    print(e-s)
  

预期输出:
  预处理时间
  5.01
  花费的时间
  10

     

在4个进程上运行时的实际输出:
  预处理时间
  5.01
  预处理时间
  5.12
  预处理时间
  5.35
  预处理时间
  5.41
  花费的时间
  10

但是,尽管对每个进程都运行了预处理,但此代码的输出正确(并已验证),据我所知,这并不是应该做的事情。然后,当我使用Teradata Pull处理近5000万条记录而不是从仅包含一小部分数据的csv中提取数据时,就会出现问题。没有多处理功能的TD拉动效果很好,但是有多处理功能时会引发以下错误:

  

数据库名称​​

中没有更多的后台打印空间

这可能是每个进程都在运行TD Pull。
如何确保Pool仅并行运行传递给它的函数,而不从头开始运行完整的代码?

我尝试更改代码块的顺序,在name =='main'块之外调用import语句,还将数据提取和预处理代码放在单独的python代码中,并在main中使用exec()进行调用程序。

0 个答案:

没有答案