2014-09-22 25 views
16

Am bu hatayı alıyorum:Python Multiprocessing Lib Hatası (AttributeError: __exit__) <code>pool.map(funct, iterable)</code> kullanırken

AttributeError: __exit__ 

No Açıklama, sadece modülü içinde pool.py dosyasına iz yığını. Orada (pickle için piton ihtiyaçları veya bayt akışı içine liste verilerini dönüştürmek) bir picklability ile sorun henüz bu doğruysa emin değilim olabilir şüpheli

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

: Bu şekilde kullanarak

veya hata ayıklaması nasıl ise.

DÜZENLEME: kodunun yeni formatı bu hatayı üretir: ÜRETİLEN

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

HATA:

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

Eğer 'iken .. as' ne demek istiyorsunuz:

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

veya kendi terminating() bağlam yöneticisi oluşturun: bu durumda el ile sonlandırmak? ile demek istedin? – Elisha

+0

Hatalar ve gerçek kodunuz için * tam traceback * dahil edin. "while", buradaki bariz bir sözdizimi hatasıdır, örneğin, ama istisnadan, 'gerçekten' ile kullandığınız açıktır. –

cevap

31
Python 2.x

ve 3.0, 3.1 ve 3.2, multiprocessing.Pool() nesneler değil bağlam yöneticileri bulunmaktadır. Onları bir with deyiminde kullanamazsınız. Sadece Python 3,3 ve üstü gibi bunları kullanabilirsiniz. Python 3 multiprocessing.Pool() documentation Gönderen: Bu pool.close() değil pool.terminate() arayacağım

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().

önceki Python sürümleri için, contextlib.closing() kullanabilirsiniz, ancak dikkate almak.

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

kuyu bağlamında mgr olduğunu bilmiyordum Çok iyi bir açıklama için teşekkür ederim Efendim. Çözüm, işlevi çalışmaya bir adım daha yaklaştırdı - şimdi şu hatayı alıyorum: 'PicklingError: özelliği seçilemiyor>: öznitelik araması __builtin __. Function failed' – sidewaiise

+0

@sidewaiise: Bir sınıfta bir yöntem kullanmaya çalışmak belki? Bkz. [Multiprocessing: Bir sınıfta tanımlanan bir fonksiyonda Pool.map kullanarak] (http://stackoverflow.com/q/3288595) –

+0

Heh Ben sadece bunu yayınlarken okuyordum. Teşekkürler - Kısa bir okuma ve yorum yapacağım. – sidewaiise

1

with açıklamada __enter__ ve __exit__ işlevlere sahip nesne için ise, yani Context Manager Types
multiprocessing.Pool olduğunu İçerik Yöneticisi Türü değil. aşağıdakileri yapın deneyin:

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

Soru şu: * OP'nin neden böyle olduğunu düşündü *. Cevap, Python 3 belgelerinin size olduğunu söylemesidir. Ama aynı zamanda Python 3.3 ve üstü olarak da nitelendiriyor. –

+0

tamam. Python 3,3 ve yukarı – Elisha

İlgili konular