0

这是我的代码:

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')

没有:

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

所以问题是 -我怎样才能让它在另一个函数中工作?

4

1 回答 1

1

multiprocessing模块文档:

安全导入主模块

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


注意此包中的功能要求__main__子模块可以导入该模块。这在 编程指南中有介绍,但值得在这里指出。

正确的方法之一如下:

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
于 2018-06-13T15:41:57.500 回答