多进程任务处理 共享的对象如何序列化

问题

产生的原因

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