3

私は2つのクライアント(python)に同じコレクションを操作させ、コレクションはプールとして使用され、コレクションのすべてのレコードはクライアントの1つでのみ使用できます。以下のコードを使用してそれを確認しています(重要なシステムではないため、多少のエラーは許容できます)。

for i in range(100):
    record = collection.find_one({"used1":{"$exists":False}})
    record["used1"] = True
    collection.save(record)
    ...do sth I want...

しかし、2 つのクライアントが同期されない場合があり、ローカル クライアントがレコードを取得し、10 秒後にリモート クライアントも同じレコードを取得することがわかりました。

実際、2 つのクライアントが 2 秒未満でレコードを取得する場合は許容範囲ですが、10 秒では長すぎます。

ここにバッファ/同期の問題があると思います。そのような問題を減らすために何ができますか?

4

1 に答える 1

3

あなたのコードはスレッドセーフではありません。つまり、2 つのクライアントが両方とも record["used"] フィールドを "True" に更新できず、両方とも自分が最初/唯一の更新であると考えていることを保証するものではありません。

使用する必要があるのは、フィールドが存在しない場合にレコードを「True」でアトミックに更新し、更新したばかりのクライアントに同じレコードを返すfindAndModifyコマンドです。

これにより、各ドキュメントが 1 つのスレッドによってのみ処理されることが保証されますが、コードが現在抱えているのと同じ問題に対処する必要があります。つまり、この「used1」フィールドを true に設定した後、クライアント プロセスが処理を実行する前に終了した場合です。 、データが一貫性のない状態になります。

于 2012-07-14T04:24:09.217 に答える