Pickle 无法腌制 _thread.lock 个对象
Pickle can't pickle _thread.lock objects
我正在尝试使用 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
但是有什么解决方法吗?
实际上,在我的主要项目中,我找不到任何锁,但我使用了很多我无法追踪的模块。我应该寻找什么?
谢谢。
您可以尝试通过从字典中排除不可 picklable 对象来为此 class 自定义 pickling 方法:
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
模块了解不够,无法预测这是否足够。
我正在尝试使用 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
但是有什么解决方法吗?
实际上,在我的主要项目中,我找不到任何锁,但我使用了很多我无法追踪的模块。我应该寻找什么?
谢谢。
您可以尝试通过从字典中排除不可 picklable 对象来为此 class 自定义 pickling 方法:
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
模块了解不够,无法预测这是否足够。