2010-04-23 27 views
32

que estaba trabajando el siguiente ejemplo de Doug Hellmann tutorial sobre multiprocesamiento:multiprocesamiento bomba

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 correr 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ó procesos de desove sin parar, ¡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 declaración if?

Respuesta

43

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

+1

Es interesante saber ahora, después de que me cueste 2 reinicios;) –

+0

¿Cómo se puede detener esto una vez que ha comenzado? Asesinar el proceso en el administrador de tareas no parece afectarlo. –

+1

Hay límites y killall en los sistemas POSIX, pero no sé la solución para Windows. –

3

No sé de 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.

6

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 al instante, requiriendo un reinicio. Esto puede ser bastante confuso, especialmente si el uso de multiprocessing ocurre en alguna función en el interior del código. No importa qué tan oculto esté, aún necesita la verificación if en el archivo de programa principal. Esto prácticamente descarta el uso de multiprocessing en cualquier tipo de biblioteca.

multiprocessing en general parece un poco difícil. Puede tener la interfaz de la interfaz de subprocesos, pero simplemente no hay una forma sencilla de resolver el GIL.

Para los problemas de paralelización más complejas También me gustaría ver el módulo de subprocess o algunas otras bibliotecas (como mpi4py o Parallel Python).

+0

¿Algún buen tutorial sobre el paquete de subproceso? –

+0

Lo siento, no encontré ninguno realmente simple (hay un artículo de PyMOTW por ejemplo). Básicamente, usted crea procesos de Python que ejecutan su script de trabajador. Puede enviar/recibir datos utilizando stdin/stdout de estos procesos (por ejemplo, enviar objetos en escabeche). – nikow

+0

Tenga en cuenta que el multiprocesamiento tiene sus usos, y sigue siendo la opción más simple si puede hacer que funcione para su problema. Pero si no funciona para usted, entonces usar el subproceso no es mucho trabajo adicional (tal vez cien líneas de código) y le da más opciones. – nikow