Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在MongoDB中存储锁对象?_Python_Mongodb_Pymongo_Pickle - Fatal编程技术网

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

Python 如何在MongoDB中存储锁对象?,python,mongodb,pymongo,pickle,Python,Mongodb,Pymongo,Pickle,我有一个put和get函数,可以插入MongoDB: 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=Tru

我有一个put和get函数,可以插入MongoDB:

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中的值是简单类型(如字符串、dict等),则此操作有效。但如果值是对象,则无法在put函数中pickle。我得到的错误是:

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

TypeError:无法pickle lock对象

请阅读Python关于序列化的文档-。如果控制对象的定义,则可以提供一个
\uu getstate\uu()
方法,该方法可以删除不可序列化的属性,如锁


我使用它将锁设置为
None
,然后使用
\uuu setstate\uu()
作为反序列化钩子来重新初始化锁。

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


我使用它将锁设置为
None
,然后使用
\u setstate\u()
作为反序列化钩子来重新初始化锁。

您可以使用更好的序列化程序,如
dill
,它可以对
锁和python中的大多数对象进行pickle处理

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

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

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

>>> import threading
>>> l = threading.Lock()
>>> 
>>> import dill
>>> dill.dumps(l)
'\x80\x02cdill.dill\n_create_lock\nq\x00\x89\x85q\x01Rq\x02.'
然后,通过首先转换为pickle字符串,可以将大多数对象保存到数据库中