El ejemplo de grupo de multiprocesamiento no funciona y congela el kernel

Estoy intentando paralelizar un script, pero por una razón desconocida, el kernel simplemente se congela sin que se produzcan errores.

Ejemplo de trabajo mínimo:

from multiprocessing import Pool def f(x): return x*x p = Pool(6) print(p.map(f, range(10))) 

Curiosamente, todo funciona bien si defino mi función en otro archivo y luego lo importo. ¿Cómo puedo hacer que funcione sin la necesidad de otro archivo?

Trabajo con spyder (anaconda) y tengo el mismo resultado si ejecuto mi código desde la línea de comandos de Windows.

Esto sucede porque no protegió su parte de procedimiento del código para que no se vuelva a ejecutar cuando sus procesos secundarios están importando f .

Necesitan importar f , porque Windows no admite el forking como método de inicio para nuevos procesos (solo se genera). Un nuevo proceso de Python debe iniciarse desde cero, e importarse, y esta importación también activará la creación de otro Grupo en todos los procesos secundarios … y sus procesos secundarios y sus procesos secundarios.

Para evitar esta recursión, debe insertar una if __name__ == '__main__': -linea entre la parte superior, que debe ejecutarse en las importaciones y una parte inferior, que solo debe ejecutarse cuando su script se ejecute como el script principal (solo el caso de los padres).

 from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': # protect your program's entry point p = Pool(6) print(p.map(f, range(10))) 

Separar su código así es obligatorio para el multiprocesamiento en sistemas Windows y Unix-y cuando se usa con el método de inicio ‘forkserver’ en lugar del ‘fork’ predeterminado.

En general, es una buena práctica separar cualquier secuencia de comandos en “definición” superior y “ejecución como principal” inferior, para que el código sea importable sin ejecuciones innecesarias de partes que solo sean relevantes cuando se ejecutan como secuencias de comandos de nivel superior. Por último, pero no menos importante, facilita la comprensión del flujo de control de su progtwig cuando no se entremezclan definiciones y ejecuciones.