使用 Multiprocessing.Pool.map_async 报错 attribute lookup <lambda> on __main__ failed 的解决

使用 Multiprocessing.Pool.map_async 报错 attribute lookup on __main__ failed 的解决

创作背景

本菜鸡最近用 multiprocessing 中的进程池 Pool ,因为有一堆 task ,就想使用 map_async ,但是出问题,写这篇文章记录一下改 BUG 的过程。
如果觉得我这篇文章写的好的话,能不能给我 点个赞评论收藏 一条龙(☆▽☆)。如果要点个 关注 的话也不是不可以🤗。
请各位参加一下文末的 投票 哦,如果 有什么不足之处,还 请各位大佬在评论区提出,不胜感激。

问题再现

我的代码原意是 实例化一个自定义类并调用其中的函数启动 ,因为要使用 map_async ,需要传入一个函数来接收参数,所以我就想到了 lambda
下边是与我的代码 结构相似简化代码 (仅示例用):

import os
import multiprocessing as mlp

class Test:

    def __init__(self, num):
        self.num = num

    def run(self):
        print(os.getpid(), self.num)

if __name__ == '__main__':

    with mlp.Pool(processes=3) as pool:
        tasks = range(5)
        pool.map_async(lambda x: Test(x).run(), tasks).get()
    pool.join()

本满心欢喜等待启动,结果给我报了个错:

PicklingError: Can't pickle <function <lambda> at 0x00000255B24ABB88>: attribute lookup <lambda> on __main__ failed

无法序列化 lambda 函数 ???这这这……😱😱😱

解决方法

按照官方文档,multiprocessing 的依赖 pickle 模块 不能序列化 lambda function 。(就是不支持这种写法,那就 显式定义一个函数 就好咯)。
就像下边这样:

import os
import multiprocessing as mlp

class Test:

    def __init__(self, num):
        self.num = num

    def run(self):
        print(os.getpid(), self.num)


def start(task):
    return Test(task).run()

if __name__ == '__main__':

    with mlp.Pool(processes=3) as pool:
        tasks = range(5)
        pool.map_async(start, tasks).get()
    pool.join()

来看看现在的结果吧。
在这里插入图片描述

看起来很不错哦!!!

十六 char 总结

遇到 BUG 不要怕互联网帮你来解答
在这里插入图片描述




结尾

有想要一起学习 python 的小伙伴可以 私信我 进群哦。

以上就是我要分享的内容,因为 学识尚浅会有不足,还 请各位大佬指正
有什么问题也可在评论区留言。
在这里插入图片描述

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值