2012-03-25 6 views
5

私は、ウェブサイトからデータを読み込んで処理し、MongoDBにロードする機能を持っています。これをスレッドしないで実行すると正常に動作しますが、すぐにこの1つの関数を呼び出すセロリタスクを設定すると、次のエラーが頻繁に発生します: "OperationFailure:データベースエラー:不正なdb:dbnameロックタイプ:-1"OperationFailure:MongoEngine/PyMongoのスレッディング時のデータベースエラー

複数の端末でnon-celeryバージョンを実行すると、このエラーはまったく起こりません。

モンゴーとのオープンな接続ではないことは疑いありませんが、私のコードでは、すべてのモンゴーコールの直前に開かれています。あなたが正しいことが呼ばれる前開かれている接続がありますmmo.Momentで始まる行を見れば

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 

の書式設定のため申し訳ありませんが:

正確な例外は以下の通りです。 http://api.mongodb.org/python/1.5.1/faq.html#how-does-connection-pooling-work-in-pymongo - - それは、スレッドがPyMongoで取り扱われる方法とは何か持っているかのように見える研究のビットこう

私は接続を閉じて起動する必要があるかもしれませんが、私はMongoEngineはこれを行うことを期待したいが...

+1

私は助けることはできませんが、完全なスタックトレースを投稿すると、他の誰かが助けてくれる可能性が高くなります。 –

+0

@DavidWolever - 意味があります。私はちょうど私の質問を更新した。 –

答えて

2

これは、新しい接続を開始したときにdb.authenticate()を呼び出さず、MongoDBでauthを使用しているためです。

スレッドのクローズについては、接続プーリングを使用していることを確認し、ドライバがプールを管理できるようにすることをお勧めします。close()などを手動で呼び出すと多くの苦痛につながります。

詳細については、マルチスレッド環境でauthenticate()を使用する方法については、pymongoのドキュメントのthe noteを参照してください。

関連する問題