from multiprocessing import Pool
def my_function(x):
return x * x
if __name__ == '__main__':
inputs = [1, 2, 3, 4, 5]
with Pool(2) as p:
results = p.map(my_function, inputs)
print(results)
运行时出现pickle.PicklingError: Can't pickle <function my_function at 0x000001E4404394C0>: attribute lookup my_function on __main__ failed
解决方法:
这个问题是由于多进程模块multiprocessing在Windows系统上运行时的限制所导致的。在Windows系统上,multiprocessing模块使用pickle来序列化和反序列化函数,但是,对于在__main__模块中定义的函数,pickle无法正确地序列化和反序列化。
要解决这个问题,你可以将my_function定义移到单独的模块中,然后在主程序中导入该模块。这样,pickle就可以正确地序列化和反序列化函数。
以下是解决方案的示例代码:
- 创建一个名为my_module.py的文件,将my_function定义放在其中:
# my_module.py
def my_function(x):
return x * x
- 修改主程序代码,导入my_module并使用其中的my_function:
# main.py
from multiprocessing import Pool
from my_module import my_function # 导入my_function函数
if __name__ == '__main__':
inputs = [1, 2, 3, 4, 5]
with Pool(2) as p:
results = p.map(my_function, inputs)
print(results)
这样,当在Windows系统上运行主程序时,就不会再遇到pickle.PicklingError问题。