proceso - python 2 multiprocessing
Bomba de multiprocesamiento (3)
En Windows no existe una rutina fork()
, por lo que el multiprocessing
importa el módulo actual para acceder a la función worker
. Sin la instrucción if
, el proceso hijo inicia sus propios hijos y así sucesivamente.
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 traté de ejecutarlo fuera de la declaración 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ó procesos de desove sin parar, ¡y la única forma de detenerlo fue reiniciar!
¿Por qué sucedería eso? ¿Por qué no generó 5 procesos y salió? ¿Por qué necesito la declaración if?
No sé sobre el multiprocessing
, pero sospecho que genera procesos secundarios que tienen un __name__
global diferente. Al eliminar la prueba, está haciendo que todos los niños comiencen nuevamente el proceso de desove.
Tenga en cuenta que la documentación menciona que necesita la declaración if
en Windows ( here ).
Sin embargo, la documentación no dice que esto mate su máquina casi instantáneamente, requiriendo un reinicio. Así que esto puede ser bastante confuso, especialmente si el uso de multiprocessing
ocurre en alguna función en el interior del código. No importa cuán profundamente esté escondido, aún necesita la verificación if
en el archivo principal del programa. Esto prácticamente descarta el uso de multiprocessing
en cualquier tipo de biblioteca.
multiprocessing
en general parece un poco duro. Puede tener la interfaz de la interfaz de subprocesos, pero simplemente no hay una forma sencilla de resolver el 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 ).