【问题标题】:Multiprocessing Pool apply_async's workers and callback aren't called when executing in the inner scope [duplicate]在内部范围内执行时,不会调用多处理池 apply_async 的工作程序和回调 [重复]
【发布时间】:2018-11-23 04:55:43
【问题描述】:

这是我的代码:

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

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

【问题讨论】:

    标签: python multiprocessing python-multiprocessing process-pool


    【解决方案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
    

    【讨论】:

    • 好吧,我想做的是将所有辅助函数嵌套在一个父级下,在这种特殊情况下,在test 函数下,这可能吗?正如我所提到的,如果所有函数都位于顶层 - 我的示例中的代码也可以工作
    猜你喜欢
    • 2014-09-06
    • 2019-10-24
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2020-04-14
    • 2014-02-28
    相关资源
    最近更新 更多