Pickle无法对_thread.lock对象进行序列化

5

我正在尝试使用 pickle 来保存我的一个对象,但在进行转储时出现以下错误:

TypeError: 无法对 _thread.lock 对象进行 pickling

对我来说不太清楚,因为我没有在我的代码中使用任何锁。我尝试复现这个错误:

import threading
from time import sleep
import pickle


class some_class:
    def __init__(self):
        self.a = 1
        thr = threading.Thread(target=self.incr)
        self.lock = threading.Lock()
        thr.start()
    def incr(self):
        while True:
            # with self.lock:
            self.a += 1
            print(self.a)
            sleep(0.5)


if __name__ == "__main__":
    a = some_class()
    val = pickle.dumps(a, pickle.HIGHEST_PROTOCOL)
    print("pickle done!")

如果在对象内定义了线程锁,我无法对其进行pickle处理,是吗? 我认为问题出在使用了threading.lock,但是否有任何解决方法呢? 实际上,在我的主要项目中,我找不到任何锁,但我使用了很多模块,我无法追踪它们。我应该寻找什么? 谢谢。

pickle_thread.py", line 22, in val = pickle.dumps(a, pickle.HIGHEST_PROTOCOL) TypeError: can't pickle _thread.lock objects

1个回答

6
你可以尝试通过从字典中排除无法序列化的对象来定制此类的腌制方法:
def __getstate__(self):
    state = self.__dict__.copy()
    del state['lock']
    return state

当进行反序列化时,您可以手动重新创建缺失的对象,例如:

def __setstate__(self, state):
    self.__dict__.update(state)
    self.lock = threading.Lock() # ???

我对 threading 模块不够了解,无法预测是否足够。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接