我试图保存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
答案 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
<磷>氮