J'utilise 'multiprocess.Pool.imap_unordered' comme suit
from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
do some additional processing on mapped_result
Dois-je appeler pool.close
ou pool.join
après la boucle for?
pool.join()
alorspool.close()
une fois que je l' ai commencé tous les fils de la piscine, mais je ne l' ai pas essayé d' utiliserpool.imap_unordered()
comme itérables.Réponses:
Non, vous ne le faites pas, mais c'est probablement une bonne idée si vous n'allez plus utiliser la piscine.
Raisons d'appeler
pool.close
oupool.join
sont bien dites par Tim Peters dans cet article SO :la source
pool.close()
premiers et lespool.join()
seconds. Cela vous permet d'ajouter du travail entre lepool.close()
etpool.join()
qui n'a pas besoin d'attendre la fin de l'exécution du pool.pool.close()
abord, c'est en fait obligatoire. À partir de la documentation : il faut appelerclose()
outerminate()
avant d'utiliserjoin()
.J'ai eu le même problème de mémoire car l' utilisation de la mémoire continue de croître avec le multiprocessing.pool de Python lorsque je ne l'utilisais pas
pool.close()
etpool.join()
lors de l'utilisationpool.map()
avec une fonction qui calculait la distance de Levenshtein. La fonction fonctionnait bien, mais n'était pas correctement collectée sur une machine Win7 64, et l'utilisation de la mémoire continuait de croître de manière incontrôlable à chaque fois que la fonction était appelée jusqu'à ce qu'elle arrête tout le système d'exploitation. Voici le code qui a corrigé la fuite:Après avoir fermé et rejoint le pool, la fuite de mémoire a disparu.
la source
ERROR: Terminated with signal 15
avant d'ajouter le code de nettoyage,pool.close();pool.join();
mais après avoir ajouté ce code de nettoyage, je ne reçois pas les messages de la console. donc je soupçonne au moins sur ma version, python 2.7 de C7, que la piscine ne nettoyait peut-être pas exactement.