并行计算出现 pickle.PicklingError

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 : attribute lookup my_function on __main__ failed

解决方法:

这个问题是由于多进程模块multiprocessing在Windows系统上运行时的限制所导致的。在Windows系统上,multiprocessing模块使用pickle来序列化和反序列化函数,但是,对于在__main__模块中定义的函数,pickle无法正确地序列化和反序列化。

要解决这个问题,你可以将my_function定义移到单独的模块中,然后在主程序中导入该模块。这样,pickle就可以正确地序列化和反序列化函数。

以下是解决方案的示例代码:

  1. 创建一个名为my_module.py的文件,将my_function定义放在其中:
# my_module.py  
  
def my_function(x):  
    return x * x
  1. 修改主程序代码,导入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问题。

你可能感兴趣的:(python)