多处理池初始化程序无法进行酸洗

时间:2017-04-17 18:48:03

标签: python multiprocessing pool

我正在尝试使用multiprocessing.Pool来实现多线程应用程序。要分享一些变量,我使用Queue作为暗示here

def get_prediction(data):
    #here the real calculation will be performed
    ....


def mainFunction():
    def get_prediction_init(q):
        print("a")
        get_prediction.q = q

    queue = Queue()
    pool = Pool(processes=16, initializer=get_prediction_init, initargs=[queue,])

if __name__== '__main__':
    mainFunction()

此代码在Debian计算机上运行完美,但在其他Windows 10设备上完全无法正常运行。它失败并出现错误

AttributeError: Can't pickle local object 'mainFunction.<locals>.get_prediction_init'

我真的不知道究竟是什么导致错误。如何解决问题,以便我也可以在Windows设备上运行代码?

编辑:如果我在与get_predediction_init相同的级别创建mainFunction函数,问题就解决了。当我将其定义为内部函数时,它才失败。对不起我的帖子中的混淆。

1 个答案:

答案 0 :(得分:3)

问题在于你没有向我们展示的东西。例如,“mainFunction”来自您展示的AttributeError消息,这是一个谜。

这是一个基于您发布的片段的完整可执行程序。刚刚在Windows 10下运行,在Python 3.6.1下(我猜你使用的是print语法中的Python 3),打印“a”16次:

import multiprocessing as mp

def get_prediction(data):
    #here the real calculation will be performed
    pass

def get_prediction_init(q):
    print("a")
    get_prediction.q = q

if __name__ == "__main__":
    queue = mp.Queue()
    pool = mp.Pool(processes=16, initializer=get_prediction_init, initargs=[queue,])
    pool.close()
    pool.join()

修改

而且,根据你的编辑,这个程序也适合我:

import multiprocessing as mp

def get_prediction(data):
    #here the real calculation will be performed
    pass

def get_prediction_init(q):
    print("a")
    get_prediction.q = q

def mainFunction():
    queue = mp.Queue()
    pool = mp.Pool(processes=16, initializer=get_prediction_init, initargs=[queue,])
    pool.close()
    pool.join()

if __name__ == "__main__":
    mainFunction()

编辑2

现在,您已将get_prediction_init()的定义移至mainFunction的正文中。 现在我可以看到你的错误: - )

如图所示,改为在模块级别定义函数。试图腌制本地功能对象可能是一场噩梦。也许有人想与之斗争,但不是我; - )