如何在MongoDB中存储锁对象?

2024-10-04 11:23:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个插入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中的value是简单类型,比如string、dict等,那么这是有效的;但是如果value是一个对象,它就不能在put函数中进行pickle。我得到的错误是:

^{pr2}$

类型错误:无法pickle锁定对象


Tags: pathkey函数selfinfogetputvalue
2条回答

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

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

然后,通过首先转换为pickled字符串,可以将大多数对象保存到数据库中。在

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

我使用这个方法将锁设置为None,然后使用__setstate__()作为反序列化钩子来重新初始化锁。在

相关问题 更多 >