如何在 MongoDB 中存储锁定对象?
How can I store lock objects in MongoDB?
我有一个插入到 MongoDB 中的 put 和 get 函数:
def put(self,key,value):
key = self.path+"&&"+key
value1 = Binary(pickle.dumps(value))
entry = {"keyname":key,"info":value1}
self.filenode.update({"keyname":key}, { "$set" : entry }, upsert=True)
def get(self,key):
key1 = key
key = self.path+"&&"+key
res = self.filenode.find_one({"keyname":key})
if "info" in res:
x = res["info"]
res1 = pickle.loads(x)
return res1
else:
return None
如果 put 中的值是字符串、字典等简单类型,则此方法有效。但如果值是对象,则无法在 put 函数内进行 pickle。我得到的错误是:
raise TypeError, "can't pickle %s objects" % base.__name__
类型错误:无法 pickle 锁定对象
阅读 Python 的序列化文档 - pickle — Python object serialization。如果您控制对象的定义,您可以提供一个 __getstate__()
方法,该方法可以删除不可序列化的属性,如锁。
我用它来设置锁 None
然后使用 __setstate__()
作为反序列化钩子来重新初始化锁。
您可以使用更好的序列化程序,例如 dill
,它可以 pickle Lock
和 python 中的大多数对象。
>>> import threading
>>> l = threading.Lock()
>>>
>>> import dill
>>> dill.dumps(l)
'\x80\x02cdill.dill\n_create_lock\nq\x00\x89\x85q\x01Rq\x02.'
然后您可以将大多数对象保存到数据库中,方法是首先转换为腌制字符串。
我有一个插入到 MongoDB 中的 put 和 get 函数:
def put(self,key,value):
key = self.path+"&&"+key
value1 = Binary(pickle.dumps(value))
entry = {"keyname":key,"info":value1}
self.filenode.update({"keyname":key}, { "$set" : entry }, upsert=True)
def get(self,key):
key1 = key
key = self.path+"&&"+key
res = self.filenode.find_one({"keyname":key})
if "info" in res:
x = res["info"]
res1 = pickle.loads(x)
return res1
else:
return None
如果 put 中的值是字符串、字典等简单类型,则此方法有效。但如果值是对象,则无法在 put 函数内进行 pickle。我得到的错误是:
raise TypeError, "can't pickle %s objects" % base.__name__
类型错误:无法 pickle 锁定对象
阅读 Python 的序列化文档 - pickle — Python object serialization。如果您控制对象的定义,您可以提供一个 __getstate__()
方法,该方法可以删除不可序列化的属性,如锁。
我用它来设置锁 None
然后使用 __setstate__()
作为反序列化钩子来重新初始化锁。
您可以使用更好的序列化程序,例如 dill
,它可以 pickle Lock
和 python 中的大多数对象。
>>> import threading
>>> l = threading.Lock()
>>>
>>> import dill
>>> dill.dumps(l)
'\x80\x02cdill.dill\n_create_lock\nq\x00\x89\x85q\x01Rq\x02.'
然后您可以将大多数对象保存到数据库中,方法是首先转换为腌制字符串。