欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TypeError: can't pickle _thread.RLock objects

程序员文章站 2022-05-02 13:10:24
...

原因:继承了进程类的类在初始化时,pickle模块要对内部的成员变量进行序列化,但不支持对自定义对象加锁,所以会抛出类型异常的错误

比如:使用多进程的参数传递中使用了自定义类

import multiprocessing as mp
from functools import partial

class Model:
    def __init__(self):
        self.a = 1
        
def process_job(x, y):
    print("subProcess-a:",y.a) 
    return x 
    
if __name__ == '__main__':
    m = Model()
    partial_work = partial(process_job, y=m)    # 将自定义Model类的对象作为参数
    res = pool.map(partial_work, range(5))      # 这里将会报错
    pool.close()
    pool.join()
    print(res)

解决方法:把类设置为全局变量进行访问,就不用传入到子进程了

import multiprocessing as mp

class Model:
    def __init__(self):
        self.a = 1
        
A=None                                     # 将需要在子进程中使用的自定义类对象申明为全局变量
def process_job(x):
    print("subProcess-a:",A.a)             # 在子进程中访问 Model类对象
    return x

if __name__ == '__main__':
    m = Model()
    global A
    A = m                                  # 对全局变量进行赋值
    pool = mp.Pool(5)
    res = pool.map(process_job, range(5))  # 开启子进程
    pool.close()
    pool.join()
    print(res)
相关标签: 多进程