Ich verwende 'multiprocess.Pool.imap_unordered' wie folgt
from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
do some additional processing on mapped_result
Muss ich pool.close
oder pool.join
nach der for-Schleife aufrufen ?
pool.join()
dann auf,pool.close()
wenn ich alle Pool-Threads gestartet habe, aber ich habe nicht versucht, siepool.imap_unordered()
als iterable zu verwenden.Antworten:
Nein, das tust du nicht, aber es ist wahrscheinlich eine gute Idee, wenn du den Pool nicht mehr benutzen willst.
Gründe für einen Anruf
pool.close
oderpool.join
werden von Tim Peters in diesem SO-Beitrag gut gesagt :quelle
pool.close()
zuerst undpool.join()
zweitens anrufen . Auf diese Weise können Sie Arbeit zwischenpool.close()
und hinzufügenpool.join()
, ohne auf die Ausführung des Pools warten zu müssen.pool.close()
zuerst anzurufen , es ist tatsächlich obligatorisch. Aus den Dokumenten : Man muss anrufenclose()
oderterminate()
vor der Verwendungjoin()
.Ich hatte das gleiche Speicherproblem wie die Speichernutzung, die mit Pythons multiprocessing.pool weiter zunimmt, wenn ich sie nicht verwendet habe
pool.close()
undpool.join()
wenn ich siepool.map()
mit einer Funktion verwende, die die Levenshtein-Entfernung berechnet. Die Funktion funktionierte einwandfrei, wurde jedoch auf einem Win7 64-Computer nicht ordnungsgemäß gesammelt, und die Speichernutzung geriet bei jedem Aufruf der Funktion außer Kontrolle, bis das gesamte Betriebssystem heruntergefahren wurde. Hier ist der Code, der das Leck behoben hat:Nach dem Schließen und Beitreten zum Pool verschwand das Speicherleck.
quelle
ERROR: Terminated with signal 15
bevor ich den Bereinigungscode hinzugefügt habe,pool.close();pool.join();
aber nachdem ich diesen Bereinigungscode hinzugefügt habe, bekomme ich keine Konsolenmeldungen. Ich vermute also zumindest bei meiner Version, Python 2.7 von C7, dass der Pool vielleicht irgendwie nicht genau aufgeräumt hat.