2010-05-05 17 views
12

Tengo un problema con el siguiente código y con cualquier código que use la función print en los procesos secundarios. No puedo ver ninguna declaración impresa, incluso si uso sys.std[err|out].write('worker') en lugar de print.Los procesos secundarios creados con el módulo de multiprocesamiento de python no se imprimirán

Este es el código (from the official python documentation):

from multiprocessing import Process 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

La salida está en blanco.

Nota: El código siguiente utiliza el módulo threading y se imprime la salida:

import threading 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = threading.Thread(target=f, args=('bob',)) 
    p.start() 
    p.join() 

salida: hello bob

¿Me podría apuntar a la solución? Gracias por adelantado.

Respuesta

19

Prueba esto:

from multiprocessing import Process 
import sys 

def f(name): 
    print 'hello', name 
    sys.stdout.flush() 

... 

yo sepa se almacena temporalmente la salida estándar de procesan generado por el módulo multiprocessing, por lo tanto, verá la salida sólo si el búfer se llena o que explícitamente ras sys.stdout.

+0

Muchas gracias Tamas, pero esto en mi caso no funcionó ... – John

+0

¿En qué plataforma estás? Lo anterior funciona para mí en Mac OS X; de hecho, funciona incluso sin descargar sys.stdout. –

+1

Tamas, la plataforma en la que estoy trabajando es win32. Por cierto, hasta ahora traté de ejecutar el código dentro de IDLE. Hoy traté de ejecutarlo desde la línea de comandos, usando esta sintaxis: python.exe my_prog.py y funcionó. ¿Alguien sabe por qué? ¿Y cómo puedo visualizar la salida de impresión ejecutando programas dentro de IDLE? – John

3

Los documentos para multiprocesamiento explican claramente why ¡esto no funcionará!

"Nota: La funcionalidad dentro de este paquete requiere que el método __main__ sea importable por los niños. Esto está cubierto en las pautas de programación, sin embargo, vale la pena señalar aquí. Esto significa que algunos ejemplos, como los ejemplos de multiprocesamiento.Pool no funciona en el intérprete interactivo ".

+0

Antes que nada, gracias por la respuesta. Lo que hice fue escribir el código en un archivo llamado "example.py" y presionar F5 para ejecutarlo. ¿Quizás esto significa "ejecutar el código dentro de IDLE"? PD: Soy un novato de pitón, lo siento por cualquier cosa (excesivamente) obvia que pueda haber indicado aquí. – John

+0

Ah, bueno sí IDLE con el indicador ">>" cuenta como un intérprete interactivo. Por lo tanto, el multiprocesamiento básicamente no funcionará a menos que escriba el código en un archivo y presione F5 como dice o escriba "python example.py" en el símbolo del sistema. Puedo entender cómo esto podría ser un problema confuso. De nada. – manifest

-2

Obtenga PyCharm, tuve el mismo error y trabajé en él durante + -5 horas. Finalmente obtuve Pycharm sobre Anaconda y conseguí la salida. Tiene algo que ver con la versión de Windows del intérprete IPhython.

Cuestiones relacionadas