并行计算出现 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 <function my_function at 0x000001E4404394C0>: 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问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值