Ich habe eine Funktion, die Daten von einer Website liest, verarbeitet und dann in MongoDB lädt. Wenn ich das ohne Threading ausführe, funktioniert es gut, aber sobald ich Sellerie-Aufgaben aufstelle, die nur diese eine Funktion aufrufen, bekomme ich häufig den folgenden Fehler: "OperationFailure: Datenbankfehler: unauthorized db: dbname lock type: -1"OperationFailure: Datenbankfehler beim Einfädeln in MongoEngine/PyMongo
Es ist etwas seltsam, denn wenn ich die Nicht-Sellerie-Version auf mehreren Terminals laufen lasse, bekomme ich diesen Fehler überhaupt nicht.
Ich vermute, dass es etwas damit zu tun hat, dass es keine offene Verbindung zu Mongo gibt, obwohl ich in meinem Code direkt vor jedem Mongo-Aufruf einen öffne.
Die genaue Ausnahme ist unten:
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
Sorry für die Formatierung, aber wenn man sich die Linie suchen, die mit mmo.Moment beginnt es eine Verbindung direkt geöffnet werden, bevor das genannt wird.
ein wenig Forschung tut es aussieht, als ob es etwas mit der Art und Weise Einfädeln in PyMongo gehandhabt zu tun hat - http://api.mongodb.org/python/1.5.1/faq.html#how-does-connection-pooling-work-in-pymongo - ich brauche, um die Verbindungen beginnen kann zu schließen, aber ich würde erwarten MongoEngine dies zu tun ..
Ich glaube nicht, dass ich Ihnen helfen kann, aber wenn Sie den vollen Stack-Trace veröffentlichen, ist es wahrscheinlicher, dass jemand anderer Ihnen helfen kann. –
@DavidWolever - macht Sinn. Ich habe gerade meine Frage aktualisiert. –