2014-07-09 12 views
5

Sử dụng mã dưới đây gây ra:đối tượng 'Bộ sưu tập' không phải là lỗi callable trong pymongo với quá trình Pool

'Collection' object is not callable. If you meant to call the '__getnewargs__' method on a 'Collection' object it is failing because no such method exists. 

Mã: từ đa xử nhập khẩu Pool db = MongoClient (ip, port)

def f(cursor, arg): 
    for doc in cursor: 
     ... 

p = Pool(4) 
for arg in args: 
    cursor = db[dbName][collName].find() 
    p.apply_async(f,[cursor, arg]) 

db.close() 

Không thể tìm ra vấn đề là gì và cách gỡ lỗi mã.

Full Traceback:

Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "C:\Python27\lib\threading.py", line 808, in __bootstrap_inner 
    self.run() 
    File "C:\Python27\lib\threading.py", line 761, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "C:\Python27\lib\multiprocessing\pool.py", line 342, in _handle_tasks 
    put(task) 
    File "C:\Python27\lib\site-packages\pymongo\collection.py", line 1489, in __call__ 
    self.__name.split(".")[-1]) 
TypeError: 'Collection' object is not callable. If you meant to call the '__getnewargs__' method on a 'Collection' object it is failing because no such method exists. 
+1

Tại lỗi nào xảy ra? –

+0

được cập nhật với traceback đầy đủ – user1264304

+0

'Pool' được nhập từ gói' multiprocessing' cấp cao nhất hay từ một số mô-đun khác (như 'multiprocessing.dummy' hay gì đó trong pymongo)? – Blckknght

Trả lời

1

Bạn có một vấn đề trong việc sử dụng cursor. Phương thức Collection.find trả về đối tượng Cursor là vật phẩm tiêu hao. (http://api.mongodb.org/python/current/api/pymongo/cursor.html#pymongo.cursor.Cursor.getitem) Tôi không biết đây có phải là nguyên nhân của ngoại lệ hay không nhưng đó chắc chắn là một vấn đề.

Hai giải pháp cho bạn:

  1. Rõ ràng kéo các tài liệu trước khi luồng sử dụng một [:] hay list
  2. Đưa con trỏ vào apply_async và sao chép con trỏ sử dụng clone phương pháp (http://api.mongodb.org/python/current/api/pymongo/cursor.html#pymongo.cursor.Cursor.clone)
Các vấn đề liên quan