Согласованность документа Mongoengine при параллельном - PullRequest
0 голосов
/ 13 октября 2011

Я пытаюсь создать фиктивный класс-обертку (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. Как так получилось?

1 Ответ

0 голосов
/ 21 октября 2011

Это проблема чисто расы.Мои работники из сельдерея могут одновременно получить экземпляр и выполнить с ним различные операции, а затем сохранить его, без согласованности.

...