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 mongo 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 回答