欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

TypeError: can't pickle _thread.RLock objects

发布时间:2024/7/5 编程问答 50 豆豆
生活随笔 收集整理的这篇文章主要介绍了 TypeError: can't pickle _thread.RLock objects 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

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

import multiprocessing as mp from functools import partialclass Model:def __init__(self):self.a = 1def 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 mpclass Model:def __init__(self):self.a = 1A=None # 将需要在子进程中使用的自定义类对象申明为全局变量 def process_job(x):print("subProcess-a:",A.a) # 在子进程中访问 Model类对象return xif __name__ == '__main__':m = Model()global AA = m # 对全局变量进行赋值pool = mp.Pool(5)res = pool.map(process_job, range(5)) # 开启子进程pool.close()pool.join()print(res)

总结

以上是生活随笔为你收集整理的TypeError: can't pickle _thread.RLock objects的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。