2012-03-25 15 views
5

Tôi có một chức năng sẽ đọc dữ liệu từ một trang web, xử lý nó, và sau đó tải nó vào MongoDB. Khi tôi chạy điều này mà không có luồng nó hoạt động tốt nhưng ngay sau khi tôi thiết lập nhiệm vụ cần tây mà chỉ cần gọi hàm này tôi thường gặp lỗi sau: "OperationFailure: lỗi cơ sở dữ liệu: trái phép db: dbname khóa loại: -1"OperationFailure: lỗi cơ sở dữ liệu khi luồng trong MongoEngine/PyMongo

Nó hơi lạ vì nếu tôi chạy phiên bản không cần thiết trên nhiều thiết bị đầu cuối, tôi hoàn toàn không nhận được lỗi này.

Tôi nghi ngờ có liên quan đến việc không có kết nối mở với Mongo mặc dù trong mã của tôi, tôi sẽ mở một kết nối ngay trước mỗi cuộc gọi Mongo.

Ngoại lệ chính xác là dưới đây:

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 

Xin lỗi cho các định dạng nhưng nếu bạn nhìn vào các dòng bắt đầu với mmo.Moment có một kết nối được mở ngay trước đó được gọi là.

Thực hiện một chút nghiên cứu có vẻ như nó có liên quan đến cách xử lý luồng trong PyMongo - http://api.mongodb.org/python/1.5.1/faq.html#how-does-connection-pooling-work-in-pymongo - Tôi có thể cần bắt đầu đóng các kết nối nhưng tôi mong MongoEngine sẽ thực hiện việc này ..

+1

Tôi không nghĩ mình sẽ có thể trợ giúp, nhưng nếu bạn đăng toàn bộ theo dõi ngăn xếp, nhiều khả năng người khác sẽ có thể trợ giúp. –

+0

@DavidWolever - có ý nghĩa. Tôi vừa cập nhật câu hỏi của mình. –

Trả lời

2

Điều này có khả năng là do bạn không gọi db.authenticate() khi bạn bắt đầu kết nối mới và đang sử dụng auth trên MongoDB.

Về việc đóng chủ đề, tôi khuyên bạn nên đảm bảo bạn đang sử dụng kết nối tổng hợp và để người lái quản lý các hồ bơi (gọi gần() hoặc tương tự theo cách thủ công có thể dẫn đến nhiều đau).

Để biết thêm thông tin, hãy xem the note trong tài liệu về pymongo về cách sử dụng authenticate() trong môi trường nhiều luồng.