2014-09-22 18 views
16

Am nhận được lỗi này khi sử dụng pool.map(funct, iterable):Python Đa Lib Lỗi (AttributeError: __exit__)

AttributeError: __exit__ 

Không Giải thích, chỉ ngăn xếp dấu vết đến tập tin pool.py trong mô-đun.

sử dụng theo cách này:

with Pool(processes=2) as pool: 
    pool.map(myFunction, mylist) 
    pool.map(myfunction2, mylist2) 

Tôi nghi ngờ có thể là một vấn đề với các picklability (nhu cầu python để pickle, hoặc chuyển đổi dữ liệu danh sách vào dòng byte) nhưng tôi không chắc chắn nếu điều này là đúng hoặc nếu đó là cách gỡ lỗi.

EDIT: Định dạng mới của mã sản xuất lỗi này:

def governingFunct(list): 
    #some tasks 
    def myFunction(): 
     # function contents 
    with closing(Pool(processes=2)) as pool: 
     pool.map(myFunction, sublist) 
     pool.map(myFunction2, sublist2) 

LỖI SẢN XUẤT:

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 
+0

những gì bạn có ý nghĩa bởi 'thời gian .. as'? Ý bạn là 'with'? – Elisha

+0

Không bao gồm * lỗi truy nguyên đầy đủ * cho các lỗi và mã thực của bạn. 'while' là một lỗi cú pháp rõ ràng ở đây, ví dụ, nhưng từ ngoại lệ, rõ ràng là bạn đã sử dụng' with' thực sự. –

Trả lời

31

Trong Python 2.x và 3.0, 3.1 và 3.2, multiprocessing.Pool() đối tượng là cán bộ quản lý không bối cảnh. Bạn không thể sử dụng chúng trong câu lệnh with. Chỉ trong Python 3.3 trở lên bạn mới có thể sử dụng chúng như vậy. Từ Python 3 multiprocessing.Pool() documentation:

New in version 3.3: Pool objects now support the context management protocol – see Context Manager Types. __enter__() returns the pool object, and __exit__() calls terminate().

Đối với phiên bản Python trước đó, bạn có thể sử dụng contextlib.closing(), nhưng đưa vào tài khoản này sẽ gọi pool.close(), không pool.terminate(). Chấm dứt bằng tay trong trường hợp đó:

from contextlib import closing 

with closing(Pool(processes=2)) as pool: 
    pool.map(myFunction, mylist) 
    pool.map(myfunction2, mylist2) 
    pool.terminate() 

hoặc tạo của riêng quản lý terminating() ngữ cảnh của bạn:

from contextlib import contextmanager 

@contextmanager 
def terminating(thing): 
    try: 
     yield thing 
    finally: 
     thing.terminate() 

with terminating(Pool(processes=2)) as pool: 
    pool.map(myFunction, mylist) 
    pool.map(myfunction2, mylist2) 
+1

Vâng Sir cảm ơn bạn đã giải thích chi tiết như vậy. Bạn giải pháp đã di chuyển chức năng một bước gần hơn để làm việc - bây giờ tôi nhận được lỗi này: 'PicklingError: Không thể chọn : tra cứu thuộc tính __builtin __. Function failed' – sidewaiise

+0

@sidewaiise: là bạn cố gắng sử dụng một phương pháp trên một lớp học có lẽ? Xem [Multiprocessing: using Pool.map trên một hàm được định nghĩa trong một lớp] (http://stackoverflow.com/q/3288595) –

+0

Heh Tôi đã thực sự chỉ đọc khi bạn đăng bài này. Cảm ơn - Tôi sẽ sớm đọc và nhận xét. – sidewaiise

1

with tuyên bố là dành cho đối tượng có __enter____exit__ chức năng, tức là Context Manager Types
multiprocessing.Pool là không phải Loại Trình quản lý Ngữ cảnh. thử làm như sau:

pool = Pool(processes=2) 
pool.map(myFunction, mylist) 
pool.map(myfunction2, mylist2) 
+0

Câu hỏi đặt ra là tại sao OP nghĩ đó là *. Câu trả lời là tài liệu Python 3 cho bạn biết đó là. Nhưng nó cũng đủ điều kiện như Python 3.3 trở lên. –

+0

ok. không biết nó là ngữ cảnh mgr trong Python 3.3 và lên – Elisha

Các vấn đề liên quan