2010-08-04 5 views
15

No entiendo por qué este código simplePython multiproceso genera continuamente los procesos pythonw.exe sin hacer ningún trabajo real

# file: mp.py 
from multiprocessing import Process 
import sys 

def func(x): 
    print 'works ', x + 2 
    sys.stdout.flush() 

p = Process(target= func, args= (2,)) 
p.start() 
p.join() 
p.terminate() 
print 'done' 
sys.stdout.flush() 

crea procesos "pythonw.exe" de forma continua y no se imprime nada, a pesar de lo ejecuto desde la línea de comandos:

python mp.py 

estoy corriendo el último de Python 2.6 en Windows 7 de 32 y 64 bits

+0

Cuál es la salida mientras se está ejecutando? –

+0

sin salida en absoluto – lj8888

Respuesta

32

Es necesario protect then entry point of the program by using if __name__ == '__main__':.

Este es un problema específico de Windows. En Windows, su módulo debe ser importado a un nuevo intérprete de Python para que pueda acceder a su código objetivo. Si no detiene a este nuevo intérprete que ejecuta el código de inicio, generará otro hijo, lo que generará otro hijo, hasta que sea pythonw.exe lo más lejos que pueda ver.

Otras plataformas usan os.fork() para iniciar los subprocesos, por lo que no tienen el problema de volver a importar el módulo.

lo que el código tendrá que tener este aspecto:

from multiprocessing import Process 
import sys 

def func(x): 
    print 'works ', x + 2 
    sys.stdout.flush() 

if __name__ == '__main__': 
    p = Process(target= func, args= (2,)) 
    p.start() 
    p.join() 
    p.terminate() 
    print 'done' 
    sys.stdout.flush() 
+1

un detalle tan fácil, tan fácil de detectar que funcionó, gracias – lj8888

+1

Esta amenaza ha sido un salvavidas, mi secuencia de comandos simple de Python estaba generando "trillizos" de pythonw.exe y hacían que Windows se sobrecargara y se cayera. ¡Gracias! – Hornbydd

1

divertido, funciona en mi máquina Linux:

$ python mp.py 
works 4 
done 
$ 

¿Se supone que el multiprocesamiento funciona en Windows? Muchos programas originados en el mundo de Unix no manejan Windows tan bien, porque Unix usa fork(2) para clonar procesos a un precio bastante bajo, pero (entiendo) que Windows no admite fork(2) correctamente, si es que lo hace.

+5

Windows no es compatible con fork, por lo que debe iniciar un nuevo intérprete de Python y volver a importar el módulo, es decir, su secuencia de comandos. Si no ha protegido su código de inicio con 'if __name__ == '__main __':' entonces el proceso hijo lo ejecuta, lo que no es bueno. –

+2

... que se ejecuta mediante el proceso secundario del niño, que se ejecuta mediante el proceso del niño del niño, que ... – PaulMcG

Cuestiones relacionadas