Я пытаюсь создать фиктивный класс-обертку (mongoengine Document), который реализует интерфейс хэшей Redis. Например:
class HashModel(mongoengine.Document):
'''
Represents a dictionary with a name.
Interface similar to Redis Hashes
'''
name = mongoengine.StringField()
adict = mongoengine.DictField()
def safe_reload(self): # because it fails if no object present
try: self.reload()
except:pass
def fix_key(self, key): # for mongoengine validation ( if you really read my code, please also answer why does mongoengine need that )
return key.replace(".","").replace("$","")
def hset(self, key, value):
self.safe_reload()
self.adict["%s" % self.fix_key(key)] = value
self.save(safe=True)
return True
def hexists(self, key):
self.safe_reload()
key = "%s" % self.fix_key(key)
return key in self.adict
Затем я использую сельдерей для выполнения некоторых задач. Перед этим я инициализирую объект HashModel, над которым задачи выполняют некоторые операции. Но из-за многопроцессорности я заметил некоторые несоответствия. Различные процессы «получают» разные «снимки» объекта, что в любом случае естественно. Чтобы обойти эту проблему, я каждый раз заново инициализирую объект, чтобы каждый раз получать «почти» свежий снимок.
Вопрос: есть ли способ избежать повторной инициализации? Могу ли я добавить некоторый код и какой код в мой класс выше, чтобы сделать это автоматически?
EDIT:
Ответ: Похоже, что функция mongoengine.Document.reload () делает это. Я обновил свой код, чтобы показать все, что имеет отношение к моей следующей проблеме:
Вернувшись к задачам сельдерея, возникла эта проблема: когда я hset (a_key, a_value), то позже, когда я пытаюсь проверить, существует ли он, иногда hexists (a_key) возвращает False. Даже если я приведу это к hset, с помощью:
while True:
self.handler.hset(a_key, a_value)
if self.handler.hexists(a_key):
break
позже, в какой-то момент (без удаления a_key в другом месте), иногда гексисты (a_key) по-прежнему выдают False. Как так получилось?