在内部作用域中执行时,不会调用多处理池apply_async的工作程序和回调

时间:2018-06-13 14:44:33

标签: python multiprocessing

这是我的代码:

airflow

如果我在上部范围内运行(没有包含在import pandas as pd import multiprocessing as mp CPU = 4 inp = pd.DataFrame({ 'col': ['a', 'b'] }) def test(dataframe): df = dataframe.copy() def worker(data): print('worker') def callback(data): print('callback') pool = mp.Pool(CPU) for idx, row in df.iterrows(): print((idx, row['col'])) pool.apply_async(worker, args=[(idx, row['col'])], callback=callback) pool.close() pool.join() return df test(inp) 函数中),但是在将其封闭在另一个函数中之后,它可以正常工作 - 它们就不会被调用。

以下是我通过test函数收到的输出:

test

(0, 'a')
(1, 'b')

所以问题是 - 如何让它在另一个函数中运行?

1 个答案:

答案 0 :(得分:1)

来自multiprocessing模块文档:

  

安全导入主模块

     

确保新的Python解释器可以安全地导入主模块,而不会导致意外的副作用(例如   开始一个新的过程。)

  

注意此程序包中的功能要求子项可以导入__main__模块。这包括在内   Programming guidelines但是值得指出这一点。

正确的方法之一如下:

import pandas as pd
import multiprocessing as mp

CPU = 4
inp = pd.DataFrame({'col': ['a', 'b']})

def worker(data):
    print(data)
    print('worker')

def callback(data):
    print('callback')

def test(dataframe):    
    df = dataframe.copy()   

    with mp.Pool(CPU) as pool:
        for idx, row in df.iterrows():
            result = pool.apply_async(worker, args=[(idx, row['col'])], callback=callback)
            result.wait()

    return df

if __name__ == '__main__':    
    test(inp)

输出:

(0, 'a')
worker
(1, 'b')
worker
callback
callback