threading set_start_method example ejemplos python python-multiprocessing

python - set_start_method - ¿Cuándo deberíamos llamar multiprocessing.Pool.join?



python multiprocessing windows (2)

Estoy usando ''multiprocess.Pool.imap_unordered'' como sigue

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

¿Necesito llamar a pool.close o pool.join después del bucle for?


No, no es así, pero probablemente sea una buena idea si ya no va a utilizar la piscina.

Las razones para llamar a pool.close o pool.join están bien pool.join por Tim Peters en esta publicación de SO :

En cuanto a Pool.close (), debe llamar a eso cuando, y solo cuando, nunca vaya a enviar más trabajo a la instancia de Pool. Por lo tanto, normalmente se llama a Pool.close () cuando la parte de su programa principal se puede paralizar. Luego, los procesos de trabajo terminarán cuando se haya completado todo el trabajo ya asignado.

También es una práctica excelente llamar a Pool.join () para esperar a que finalicen los procesos de trabajo. Entre otras razones, a menudo no hay una buena manera de informar excepciones en código paralelizado (las excepciones ocurren en un contexto solo vagamente relacionado con lo que está haciendo su programa principal), y Pool.join () proporciona un punto de sincronización que puede informar algunas excepciones ocurridas en procesos de trabajo que de otra manera nunca verías.


Tuve el mismo problema de memoria que el uso de la memoria sigue creciendo con el multiprocessing.pool de Python cuando no pool.close() y pool.join() cuando pool.map() con una función que calcula la distancia de Levenshtein. La función funcionó bien, pero no se recolectó correctamente la basura en una máquina Win7 64, y el uso de la memoria siguió creciendo fuera de control cada vez que se invocaba la función hasta que eliminaba todo el sistema operativo. Aquí está el código que corrigió la fuga:

stringList = [] for possible_string in stringArray: stringList.append((searchString,possible_string)) pool = Pool(5) results = pool.map(myLevenshteinFunction, stringList) pool.close() pool.join()

Después de cerrar y unirse a la piscina, la pérdida de memoria desapareció.