如何在 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.'

然后您可以将大多数对象保存到数据库中,方法是首先转换为腌制字符串。