を使用して複数のプロセスがレコードを読み取る MongoDB コレクション (ジョブ キューとして使用) がありますfindAndModify
。FindAndModify
フィールドが「false」であるレコードを検索し、active
「true」に設定して、他のプロセスが同じレコードを読み取らないようにします。
問題は、ログを見ると、さまざまなプロセスが同じレコードを読み取っていることがわかります。これは、2 つのプロセスが同時にキューから読み取ったときに発生するようです。一度に 1 つのプロセスだけがコレクションから読み取るようにする方法はありますか?
Mongo 2.2.3 と pymongo 2.2 を使用しています。
どうもありがとう!
編集:問題のログは次のとおりです。
worker.3 2013-03-18 23:57:45,434 default-worker-3
project_name INFO キュー ジョブ: ジョブ ID: 5147a90f68e8fe0097002bdfworker.3 2013-03-18 23:57:47,608 default-worker-3
project_name INFO 入力: 14497 ドキュメントworker.2 2013-03-18 23:57:45,440 default-worker-2
project_name INFO キュー ジョブ: ジョブ ID: 5147a90f68e8fe0097002bdfworker.2 2013-03-18 23:57:47,658 default-worker-2
project_name INFO 入力: 14497 ドキュメント
ご覧のとおり、worker.3 と worker.2 はキューから同じジョブを読み取ります (両方のワーカーで同じ mongodb ID を持っています)。
find_and_modify コマンド:
query = {"active": False}
try:
return self.collection.find_and_modify(
query=query,
update={"$set": {"active": True}},
upsert=False,
sort={"added_on": 1},
limit=1
)
except Exception, exc:
LOGGER.exception(exc)