python多进程mulprocessing初始化传参进行pickle时不能序列化local局部变量
报错代码:
点击查看代码
import multiprocessing
class calculate():
"""
AttributeError: Can't pickle local object 'calculate.run.<locals>.f'
不能pickle当前局部变量
"""
def run(self):
def f(x):
return x*x
p = multiprocessing.Pool()
return p.map(f, [0, 1, 2])
if __name__ == '__main__':
c1 = calculate()
print(c1.run())
报错效果:

可以运行的代码:
点击查看代码
import multiprocessing
'''
class calculate():
"""
AttributeError: Can't pickle local object 'calculate.run.<locals>.f'
不能pickle当前局部变量
"""
def run(self):
def f(x):
return x*x
p = multiprocessing.Pool()
return p.map(f, [0, 1, 2])
'''
def unwrap_self_f(arg, **kwargs):
# print(arg)
return calculate.f(*arg, **kwargs)
class calculate():
def f(self, x):
return x*x
def run(self):
p = multiprocessing.Pool()
return p.map(unwrap_self_f, zip([self,]*3, [0, 1, 2]))
if __name__ == '__main__':
c1 = calculate()
print(c1.run())
之所以第一个代码会报错,是因为python多进程mulprocessing初始化传参进行pickle时不能序列化local局部变量,因此第二个代码在进行多进程初始化时传入的是一个全局的函数,而这个传入函数将该对象的method进行了包装。
因此我们可以进行更加简洁的实现:
点击查看代码
import multiprocessing
def unwrap_self_f(arg, **kwargs):
# print(arg)
return calculate.f(*arg, **kwargs)
class calculate():
def f(self, x):
return x*x
def run(self):
p = multiprocessing.Pool()
# return p.map(unwrap_self_f, zip([self,]*3, [0, 1, 2]))
return p.map(self.f, [0, 1, 2])
if __name__ == '__main__':
c1 = calculate()
print(c1.run())
本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。
如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。
posted on 2025-11-16 18:28 Angry_Panda 阅读(3) 评论(0) 收藏 举报
浙公网安备 33010602011771号