Mongodb FindAndModify проблема с многопроцессорным использованием - PullRequest
2 голосов
/ 19 января 2011

Я использую python 2.6.6, pymongo 1.9, mongodb 1.6.5, Ubuntu 10.10

У меня странная проблема с командой FindAndModify.

У меня одновременно работают два одинаковых процесса.Они получают записи из базы данных с FindAndModify (реализует какую-то очередь).

Таким образом, чтобы сделать запись только одного процесса, я делаю это:

find_and_modify({query:{"status":"loaded"},update:{"$set": {"status":"analyzing"}}) 

Это работает так:

1 процесс использует findAndModify, чтобы получить процесс задания 2, использует findAndModifyполучить работу 1 процесс создать работу и сохранить результат 2 процесс выполнить работу и сохранить результат

Таким образом, процесс получает запись со статусом «загружен» и меняет ее на «анализ».И если эта операция атомарная, то второй процесс не должен видеть эту запись, поскольку он не удовлетворяет запросу.

Но иногда два процесса получают одну и ту же запись одновременно, и это проблема.

Может кто-нибудь сказать, почему это происходит и как я могу реализовать очередь с mongodb, которая заблокирует чтение документов более чем одним процессом?

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 января 2011

Пока пытался воспроизвести эту ошибку в автономном скрипте, обнаружил, что проблема не в MongoDB.MongoDB работает, как сказано в руководстве, поэтому вопрос сейчас закрыт.

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

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

Вы можете использовать флаг snapshot = True, чтобы избежать дублирования.

...