从pymongo的线程中读取没有结果

时间:2013-05-17 14:59:43

标签: python mongodb pymongo

我试图保存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

1 个答案:

答案 0 :(得分:2)

您的实现问题是您使用默认使用pymongo.Connection的未确认写入。通过使用此功能,您可以进入在内存中未确认写入但您在客户端中收到确认的情况。如果您更快地处理响应并发出查找请求,您将遇到类似这样的情况。你基本上太快了:)

现在,如果您使用确认write concern 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
<磷>氮