使用 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
的小伙伴可以 私信我
进群哦。
以上就是我要分享的内容,因为 学识尚浅,会有不足,还 请各位大佬指正。
有什么问题也可在评论区留言。