我正在尝试使用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
函数,问题就解决了。当我将其定义为内部函数时,它才失败。对不起我的帖子中的混淆。
答案 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()
现在,您已将get_prediction_init()
的定义移至mainFunction
的正文中。 现在我可以看到你的错误: - )
如图所示,改为在模块级别定义函数。试图腌制本地功能对象可能是一场噩梦。也许有人想与之斗争,但不是我; - )