Pickle无法腌制_thread.lock对象

时间:2018-05-21 03:55:49

标签: python-3.x pickle

我正在尝试使用pickle来保存我的某个对象,但在尝试转储它时遇到此错误:

  

TypeError:无法pickle _thread.lock对象

我不清楚,因为我的代码中没有使用任何锁。我试图重现这个错误:

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_thread.py“,第22行,in       val = pickle.dumps(a,pickle.HIGHEST_PROTOCOL)TypeError:无法pickle _thread.lock对象

如果我在对象中定义一个线程锁,我就不能腌它,对吧? 我认为这里的问题是使用threading.lock但是有没有解决方法呢? 实际上,在我的主项目中,我找不到任何锁,但我使用了很多模块,我无法追踪它们。我应该寻找什么? 感谢。

1 个答案:

答案 0 :(得分:2)

您可以尝试通过从字典中排除无法拾取的对象来定制此类的酸洗方法:

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模块的了解还不足以预测这是否足够。