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())



报错效果:

image



可以运行的代码:

点击查看代码
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())





posted on 2025-11-16 18:28  Angry_Panda  阅读(3)  评论(0)    收藏  举报

导航