web-dev-qa-db-fra.com

Quand devrions-nous appeler multiprocessing.Pool.join?

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?

54
hch

Non, ce n'est pas le cas, mais c'est probablement une bonne idée si vous n'utilisez plus la piscine.

Raisons pour appeler pool.close ou pool.join _ sont bien cités par Tim Peters dans this SO post :

En ce qui concerne Pool.close (), vous devez appeler cela quand - et seulement quand - vous ne soumettez plus jamais de travail à l'instance Pool. Ainsi, Pool.close () est généralement appelé lorsque la partie parallélisable de votre programme principal est terminée. Ensuite, les processus de travail se termineront lorsque tous les travaux déjà attribués seront terminés.

C'est aussi une excellente pratique d'appeler Pool.join () pour attendre la fin des processus de travail. Entre autres raisons, il n’existe souvent aucun moyen efficace de signaler les exceptions dans du code parallélisé (les exceptions se produisent dans un contexte vaguement lié à ce que fait votre programme principal), et Pool.join () fournit un point de synchronisation permettant de signaler certaines exceptions survenues. dans des processus de travail que vous ne verriez jamais autrement.

71
Bamcclur

J'avais le même problème de mémoire que l'utilisation de la mémoire ne cesse de croître avec multiprocessing.pool de Python lorsque je n'utilisais pas pool.close() et pool.join() lorsque j'utilisais pool.map() avec une fonction qui calcule la distance de Levenshtein. La fonction fonctionnait bien, mais les ordures n’avaient pas été correctement collectées sur un ordinateur Win7 64, et l’utilisation de la mémoire devenait de plus en plus incontrôlable à chaque appel de la fonction jusqu’à ce que le système d’exploitation complet soit mis hors service. Voici le code qui a corrigé la fuite:

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

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

Après avoir fermé et rejoint la piscine, la fuite de mémoire est partie.

31
Odysseus Ithaca