0

エントリをmongodbに保存してIDを取得しようとしています。次に、このエントリをスレッドで見つけたいと思います。でも、できないこともあります。

import pymongo
import bson
import threading

connection = pymongo.Connection("localhost", 27017)
db = connection.test

def set_cache(db):
    cache_id = db.test_collection.save({'test': 'some string'})
    return cache_id

def get_cache(db, cache_id):
    entry = db.test_collection.find_one({'_id' : bson.objectid.ObjectId(cache_id)})
    if not entry:
        print('No entry for %s' % cache_id)

    return entry

i = 0
while 1:
    i += 1
    cache_id = set_cache(db)

    t = threading.Thread(target=get_cache, args=(db, cache_id))
    t.start()
    t.join()

    if i > 10000:
        break

そのため、「~のエントリがありません」と表示されることがあります。しかし、このエントリはmongoで見ることができます。python2.6モンゴ2.0.6

4

1 に答える 1

2

実装の問題は、未確認の書き込みをデフォルトの使用法で使用していることですpymongo.Connection。これを使用すると、書き込みがメモリで確認されていなくても、クライアントで確認を受け取るという状況に入ることができます。応答の処理と検索要求の発行を高速化すると、このような状況に陥ります。あなたは基本的に速すぎます:)

ここで、確認書き込み懸念w:1 を使用するか、新しいクラスを使用するだけpymongo.MongoClientで (そうすることをお勧めします)、そのような状況にはなりません:

import pymongo
import bson
import threading

connection = pymongo.MongoClient("localhost", 27017)
db = connection.test

def set_cache(db):
    cache_id = db.test_collection.save({'test': 'some string'})
    return cache_id

def get_cache(db, cache_id):
    entry = db.test_collection.find_one({'_id' : bson.objectid.ObjectId(cache_id)})
    if not entry:
        print('No entry for %s' % cache_id)

    return entry

i = 0
while 1:
    i += 1
    cache_id = set_cache(db)

    t = threading.Thread(target=get_cache, args=(db, cache_id))
    t.start()
    t.join()

    if i > 10000:
        break

N.

于 2013-05-17T17:24:59.583 に答える