Multiprocessing.Pool.join'i ne zaman çağırmalıyız?


96

'Multiprocess.Pool.imap_unordered' aşağıdaki gibi kullanıyorum

from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
    do some additional processing on mapped_result

Aramaya gerek var mı pool.closeveya pool.joindöngü sonrasında?


Genelde tüm havuz iş parçacıklarını başlattıktan pool.join()sonra ararım pool.close(), ancak pool.imap_unordered()yinelenebilir olarak kullanmayı denemedim.
Bamcclur

8
katılma veya kapatmanın anlamı nedir? Onları aramadım ve kodum iyi çalışıyor gibi görünüyor. Ancak, bunları adlandırmamanın zombi süreçlerine veya diğer ince şeylere yol açacağından endişeliyim.
hch

Yanıtlar:


113

Hayır, kullanmıyorsun, ama artık havuzu kullanmayacaksan muhtemelen iyi bir fikir.

Bu SO gönderisinde Tim Peters tarafından telefonla aranma pool.closeveya pool.joiniyi söylenme nedenleri :

Pool.close () ile ilgili olarak, bunu ne zaman - ve sadece ne zaman - Havuz örneğine asla daha fazla iş göndermeyeceğiniz zaman çağırmalısınız. Yani Pool.close () genellikle ana programınızın paralelleştirilebilir kısmı bittiğinde çağrılır. Daha sonra, zaten atanmış olan tüm işler tamamlandığında çalışan işlemler sona erecektir.

Çalışan işlemlerin sona ermesini beklemek için Pool.join () 'i çağırmak da mükemmel bir uygulamadır. Diğer nedenlerin yanı sıra, paralelleştirilmiş koddaki istisnaları rapor etmenin genellikle iyi bir yolu yoktur (istisnalar yalnızca ana programınızın ne yaptığıyla ilgili bir bağlamda meydana gelir) ve Pool.join (), meydana gelen bazı istisnaları bildirebilen bir senkronizasyon noktası sağlar. aksi takdirde asla göremeyeceğiniz çalışan süreçlerde.


9
birini diğerinden önce aramak daha mı iyi?
RSHAP

9
Görünüşe göre insanlar pool.close()birinci ve pool.join()ikinci aramayı seviyor. Bu , havuzun yürütmeyi bitirmesini beklemesi gerekmeyen pool.close()ve arasına iş eklemenizi sağlar pool.join().
Bamcclur

34
@ Bamcclur'un yorumuna eklemek için - sadece pool.close()önce aramak iyi bir fikir değil , aslında zorunlu. Gönderen docs : Tek çağırmalıdır close()veya terminate()kullanmadan önce join().
Bogd

4
@Bogd Ama neden zorunlu? Bu soruya cevap verir misiniz lütfen?
agdhruv

Agdhruvs sorusuna bir cevap harika olurdu!
kırbaç

44

Ben aynı hafıza sorunu vardı Python'un multiprocessing.pool ile büyüyen Bellek kullanımı keep kullandığım vermedi pool.close()ve pool.join()kullanırken pool.map()Levenshtein mesafe hesaplanmış bir işlevle. İşlev iyi çalıştı, ancak bir Win7 64 makinesinde düzgün bir şekilde toplanmadı ve bellek kullanımı, tüm işletim sistemini kapatana kadar işlev her çağrıldığında kontrolden çıkmaya devam etti. Sızıntıyı gideren kod şu:

stringList = []
for possible_string in stringArray:
    stringList.append((searchString,possible_string))

pool = Pool(5)
results = pool.map(myLevenshteinFunction, stringList)
pool.close()
pool.join()

Havuzu kapatıp katıldıktan sonra bellek sızıntısı ortadan kalktı.


1
ERROR: Terminated with signal 15temizleme kodunu pool.close();pool.join();eklemeden önce alıyordum ancak bu temizleme kodunu ekledikten sonra konsol mesajlarını alamıyorum. bu yüzden en azından benim C7'den python 2.7 sürümümde havuzun bir şekilde tam olarak temizlenemediğinden şüpheleniyorum.
Trevor Boyd Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.