2012-03-25 26 views
5

穿线时,我有一个函数,会从网站读取数据,处理它,然后将其加载到MongoDB的。当我不穿它工作正常,但只要我设置,只是调用这一功能,我经常收到以下错误芹菜任务运行此:“OperationFailure:数据库错误:未授权的DB:DBNAME锁定类型:-1”OperationFailure:数据库错误MongoEngine/PyMongo

这有点奇怪,因为如果我在多个终端上运行非芹菜版本,我根本没有得到这个错误。

我怀疑它是做虽然在我的代码,我每蒙戈呼叫前右开口一上来有没有被打开的连接到蒙戈。

确切的例外是下面:

Task twitter[a974bfcc-d6ca-4baf-b36f-cae9143ce2d9] raised exception: OperationFailure(u'database error: unauthorized db:data lock type:-1 client:68.193.49.9',) 
Traceback (most recent call last): 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/celery/execute/trace.py", line 36, in trace 
    return cls(states.SUCCESS, retval=fun(*args, **kwargs)) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/celery/app/task/__init__.py", line 232, in __call__ 
    return self.run(*args, **kwargs) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/celery/app/__init__.py", line 172, in run 
    return fun(*args, **kwargs) 
File "/djangoblog/network/tasks.py", line 40, in twitter 
    n_twitter.GetTweetsTwitter(user) 
File "/djangoblog/network/twitter.py", line 255, in GetTweetsTwitter 
    id = SaveTweet(user, network, tweet) 
File "/djangoblog/network/twitter.py", line 150, in SaveTweet 
    if mmo.Moment.objects(user=user.id,source_id=id,network=network.id).count() == 0: 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/mongoengine/queryset.py", line 933, in count 
    return self._cursor.count(with_limit_and_skip=True) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/mongoengine/queryset.py", line 563, in _cursor 
    self._cursor_obj = self._collection.find(self._query, 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/mongoengine/queryset.py", line 493, in _collection 
    if self._collection_obj.name not in db.collection_names(): 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/database.py", line 361, in collection_names 
    names = [r["name"] for r in results] 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/cursor.py", line 703, in next 
    if len(self.__data) or self._refresh(): 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/cursor.py", line 666, in _refresh 
    self.__uuid_subtype)) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/cursor.py", line 628, in __send_message self.__tz_aware) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/helpers.py", line 101, in _unpack_response error_object["$err"]) 
OperationFailure: database error: unauthorized db:data lock type:-1 client:68.193.49.9 

很抱歉的格式,但如果你看看与mmo.Moment开头的行有一个连接被打开这就是所谓的权利之前。

做了一些研究,它看起来就好像它是与线程在PyMongo处理方式 - http://api.mongodb.org/python/1.5.1/faq.html#how-does-connection-pooling-work-in-pymongo - 我可能需要开始关闭连接但是我希望MongoEngine在做这个..

+1

我不认为我能够提供帮助,但是如果您发布完整的堆栈跟踪,则其他人可能会提供帮助的可能性更大。 – 2012-03-25 07:42:33

+0

@DavidWolever - 有道理。我刚刚更新了我的问题。 – 2012-03-25 13:55:57

回答

2

这可能是由于以下事实:当您启动新连接并在MongoDB上使用身份验证时,您没有调用db.authenticate()。

关于线程的结束,我会建议确保您使用连接池,并让驾驶员管理池(调用close()或类似的手动可以导致很多的痛苦)。

欲了解更多信息请参阅the note的pymongo文档中有关使用身份验证()在多线程环境。