Bomba de multiprocesamiento

Estaba trabajando en el siguiente ejemplo del tutorial de Doug Hellmann sobre multiprocesamiento:

import multiprocessing def worker(): """worker function""" print 'Worker' return if __name__ == '__main__': jobs = [] for i in range(5): p = multiprocessing.Process(target=worker) jobs.append(p) p.start() 

Cuando intenté ejecutarlo fuera de la sentencia if:

 import multiprocessing def worker(): """worker function""" print 'Worker' return jobs = [] for i in range(5): p = multiprocessing.Process(target=worker) jobs.append(p) p.start() 

Comenzó a generar procesos sin interrupción, y la única forma de detenerlo era reiniciar.

¿Por qué sucedería eso? ¿Por qué no generó 5 procesos y salió? ¿Por qué necesito la sentencia if?

En Windows no hay una rutina fork() , por lo que el multiprocessing importa el módulo actual para obtener acceso a la función de worker . Sin la sentencia if , el proceso hijo comienza con sus propios hijos y así sucesivamente.

Tenga en cuenta que la documentación menciona que necesita la instrucción if en windows ( aquí ).

Sin embargo, la documentación no dice que esto mate su máquina casi instantáneamente, lo que requiere un reinicio. Por lo tanto, esto puede ser bastante confuso, especialmente si el uso del multiprocessing ocurre en alguna función dentro del código. No importa cuán profundamente oculto esté, todavía necesita el control if en el archivo principal del progtwig. Esto prácticamente descarta el uso de multiprocessing en cualquier tipo de biblioteca.

multiprocessing en general parece un poco rudo. Puede que tenga la interfaz de la interfaz de subproceso, pero simplemente no existe una forma simple de evitar la GIL.

Para problemas de paralelización más complejos, también vería el módulo de subprocess o algunas otras bibliotecas (como mpi4py o Parallel Python ).

No sé de multiprocessing , pero sospecho que genera procesos secundarios que tienen un __name__ global diferente. Al eliminar la prueba, está haciendo que cada niño comience nuevamente el proceso de desove.