python-3.x - Pickle 不能 pickle _thread.lock 对象

标签 python-3.x pickle

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

TypeError: can't pickle _thread.lock objects



我不清楚,因为我没有在我的代码中使用任何锁。我试图重现此错误:
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", line 22, in val = pickle.dumps(a, pickle.HIGHEST_PROTOCOL) TypeError: can't pickle _thread.lock objects



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

最佳答案

您可以尝试通过从字典中排除不可 pickle 的对象来自定义此类的 pickle 方法:

def __getstate__(self):
    state = self.__dict__.copy()
    del state['lock']
    return state

unpickling 时,您可以手动重新创建丢失的对象,例如:
def __setstate__(self, state):
    self.__dict__.update(state)
    self.lock = threading.Lock() # ???

我对 threading 了解不够模块来预测这是否足够。

关于python-3.x - Pickle 不能 pickle _thread.lock 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50441786/

相关文章:

python-3.x - 如何在 Holoviews 中设置事件工具

grid - Python/Tkinter 如何更新网格中的信息

python - 如何在 python3.6 中将包含键和值列表的字典初始化为空集?

python - 使用更改的模块路径对 python 对象进行 unpickling

python - 为什么对未 pickle 的 cifar10 数据集进行 pickle 会产生不同的大小?

python-3.x - Pandas Dataframe 使用合并过滤结果。编码解码问题

python - Seaborn 折线图样式导致重复的图例条目

python - 如何在 "stop"和 "resume"长时间运行Python脚本?

python - 为什么不能 unpickled 这个 set 子类的实例?

matplotlib - matplotlib 和 Log10Transform 中的可拾取图形