PyMongo无法与多线程一起使用。

3
以下代码无法在Python 2.6或Python 3.2中运行。
测试代码:
import pymongo

class A(Thread):  
        def __init__(self):  
            Thread.__init__(self)  
            self.conn = pymongo.Connection('localhost',30000)  
            self.mongo = self.conn.puppet  
            self.mongo.authenticate('test','123')  
        def run(self):  
            print self.mongo.href.find_one()  

A().start()

异常信息:

 OperationFailure: database error: unauthorized db:puppet lock
   type:-1 client:127.0.0.1  

有什么想法来修复这个问题吗?

当然,我的mongodb已经启动并运行。我已经进行了单线程测试,一切正常。 - adamsmith
1个回答

3

这可能与pymongo处理认证的方式有关,详见API文档中的说明 - Pymongo不会在线程之间缓存认证凭据,因此每个线程都必须单独进行认证。


1
是的,“每个线程必须单独进行身份验证”,这就是我所做的。现在我相信我们不能同时使用身份验证和多线程,这是一个错误。 - adamsmith
我相信我的代码符合Pymongo API - 我正在使用线程中的不同实例。您的建议并没有真正解决我的问题。非常抱歉,即使它是唯一的答案,我也不能接受您的答案。 - adamsmith
明白了 - 你使用的是哪个版本的pymongo和mongoDB?- 最近在2.0版本中有一些改进:https://jira.mongodb.org/browse/PYTHON-4 - Adam Comerford
我稍后会尝试新版本。无论如何这是pymongo的一个bug,感谢您的时间。 - adamsmith
4
自pymongo 2.0版本起,本回答不正确,正如Adam C所指出的那样。http://api.mongodb.org/python/current/api/pymongo/database.html#pymongo.database.Database.authenticate 中写道:当在多个线程间共享连接时,所有线程将共享身份验证。 - jbenet
这就是为什么我使用 Rust 驱动程序时会遇到相同的错误。谢谢。当每个线程都被授权时,它可以正常工作。 - DenisKolodin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接