2010-12-04 4 views
5

Estoy explorando el módulo de multiproceso de Python y no entiendo por qué el siguiente código no imprime nada en absoluto. Sin el ciclo while, el programa imprime Worker_1 como se esperaba.Multiproceso de Python: sin salida con while-loop en la función de trabajador

import multiprocessing, time 

def worker1(): 
    print 'Worker_1' 
    while 1: 
     print 'Worker_1' 
     time.sleep(3) 
    return 

if __name__ == '__main__': 
    jobs = [] 
    p = multiprocessing.Process(target=worker1) 
    jobs.append(p) 
    p.start() 
+0

No soy un maestro en el módulo de multiprocesamiento, y no puedo probarlo ahora, pero intente agregar 'p.join()' después de su 'p.start()'. Si el programa principal sale después de que se inicia el subproceso, ¿continúa el subproceso? No lo creo, pero no sé. Tenga en cuenta que esto significa que tendrá que hacer algunos chanchullos para que el trabajador se detenga cuando lo desee. Alternativamente, mira el módulo de la horquilla tal vez. –

Respuesta

2

En mi sistema (Python 2.6 & 2.7 en Linux), esto funciona como se esperaba. ¿Qué plataforma estás usando? En algunas plataformas (Windows), se debe emular el fork creando un proceso totalmente nuevo y configurándolo. Sospecho que algunos stdout no se transfieren al proceso secundario. Pruebe:

  • El módulo threading. Es suficiente si solo quieres esperar un evento en un hilo.
  • El funcionamiento de su programa en una plataforma compatible con POSIX, como BSD, Linux o Solaris
  • Enviar a un archivo
+0

Actualmente estoy trabajando con Eclipse y PyDev en Windows. La salida a un archivo tampoco funciona. Acabo de obtener un archivo vacío. Lo que no entiendo es la importancia del ciclo while. Hay salida sin el bucle, pero no hay salida con él. – chessweb

+0

Intenta agregar sys.stdout.flush() tal vez? –

+0

No puedo creer que 'print (" something ")' no funcione en un proceso secundario en Windows. 'tenedor' no es la razón. Probé el código portado a Python 3.4 de la pregunta y produce el resultado esperado con ['multiprocesssing.set_start_method ('spawn')'] (http://docs.python.org/3.4/library/multiprocessing.html # contexts-and-start-methods) ('fork' naturalmente también funciona). – jfs

0

¿Está utilizando REPOSO? Creo que este es el problema. El código que tiene funciona para mí en Linux cuando se lo llama desde la línea de comando (imprime 'Worker_1' cada 3 segundos). Cuando lo intento en IDLE, se detiene de inmediato. Esto se debe a que no tiene el p.join() allí, lo que da como resultado que el proceso principal se detenga de inmediato, lo que detiene el proceso de trabajo. Aparentemente, p.join() no es tan necesario desde la línea de comandos en Linux, aunque lo recomendaría de todos modos.

Sin embargo, incluso con p.join() y usando IDLE, la secuencia de comandos se queda allí y no vemos ningún texto. Esto es, creo, debido a la extraña forma en que IDLE redirecciona stdout a idlelib.rpc.RPCProxy. Entonces, en otras palabras, si está utilizando IDLE, ese es su problema.

+0

Estoy usando Ecplise con PyDev en Windows. – chessweb

Cuestiones relacionadas