2015-10-17 2 views
1

У меня есть пут и получить функцию, которая вставляет в MongoDB:Как хранить объекты блокировки в 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 

Это работает, если значение в оферте простого типа, такие как строки, Dict и т.д. Но если значение является объект не в состоянии протравить внутри функции put. Ошибка я получаю:

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

TypeError: не солить блокировки объектов

ответ

1

Есть чтение документации Python на сериализации - pickle — Python object serialization. Если вы контролируете определение объекта, вы можете предоставить метод __getstate__(), который может удалить несериализуемые атрибуты, такие как блокировки.

Я использую это, чтобы установить блокировку на None, затем используйте __setstate__() в качестве де-сериализующего крюка для повторной инициализации блокировки.

3

Вы можете использовать лучший сериализатор, такой как dill, который может мариновать Lock и большинство объектов в python.

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

Тогда вы можете сохранить большинство объектов в базе данных, сначала преобразовывая их в маринованную строку.

Смежные вопросы