如何在MongoDB中存储锁定对象?

时间:2015-10-17 02:02:41

标签: python mongodb pymongo pickle

我有一个插入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中的值是简单类型(如string,dict等),则此方法有效。但如果value是对象,则无法在put函数内部进行pickle。我得到的错误是:

raise TypeError, "can't pickle %s objects" % base.__name__

TypeError:无法锁定锁定对象

2 个答案:

答案 0 :(得分:3)

您可以使用更好的序列化程序,例如dill,它可以在python中挑选Lock和大多数对象。

>>> import threading
>>> l = threading.Lock()
>>> 
>>> import dill
>>> dill.dumps(l)
'\x80\x02cdill.dill\n_create_lock\nq\x00\x89\x85q\x01Rq\x02.'

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

答案 1 :(得分:1)

阅读Python关于序列化的文档 - pickle — Python object serialization。如果您控制对象的定义,则可以提供__getstate__()方法,该方法可以删除锁定等不可序列化的属性。

我使用它来设置锁定None,然后使用__setstate__()作为反序列化挂钩来重新初始化锁。