问题
- 问题表现
多进程任务处理 共享的对象不能被pickle序列化 - 报错信息
产生的原因
TypeError: cannot pickle 'thread.lock' object
错误通常出现在使用多线程或多进程编程时,这是因为 threading.Lock
对象不是可序列化的,而 pickle
无法处理不可序列化的对象。
解决方法
可以创建一个队列 queue。将不可序列化的对象放入队列中。在子进程中从队列中取对象使用
参考示例:
import multiprocessing
import threading
class MyClass:
def __init__(self):
self.lock = threading.Lock()
self.data = "some data"
def worker(queue):
# 从队列中获取对象
obj = queue.get()
# 使用对象
with obj.lock:
print(f"Data in worker: {obj.data}")
if __name__ == "__main__":
# 创建队列
queue = multiprocessing.Queue()
# 创建对象
obj = MyClass()
# 将对象放入队列
queue.put(obj)
# 创建子进程
process = multiprocessing.Process(target=worker, args=(queue,))
# 启动子进程
process.start()
# 等待子进程结束
process.join()