No hay salida del proceso utilizando multiprocesamiento

Soy un principiante en multiprocesamiento, ¿alguien puede decirme por qué esto no produce ningún resultado?

import multiprocessing def worker(num): """thread worker function""" print('Worker:', num) if __name__ == '__main__': jobs = [] for i in range(4): p = multiprocessing.Process(target=worker, args=(i,)) jobs.append(p) p.start() 

Está iniciando su Process() , pero nunca espera que se complete, por lo que la ejecución de su progtwig finaliza antes de que finalice el proceso en segundo plano. Intenta esto, con una llamada a Process.join() :

 import multiprocessing import sys def worker(num): """thread worker function""" print('Worker:', num) sys.stdout.flush() if __name__ == '__main__': jobs = [] for i in range(4): p = multiprocessing.Process(target=worker, args=(i,)) jobs.append(p) p.start() map(lambda p: p.join(), jobs) 

Aquí usamos map() para llamar join() en cada proceso en la lista de jobs .

Aquí hay un ejemplo de este trabajo:

 In [127]: %paste import multiprocessing import sys def worker(num): """thread worker function""" print('Worker:', num) sys.stdout.flush() if __name__ == '__main__': jobs = [] for i in range(4): p = multiprocessing.Process(target=worker, args=(i,)) jobs.append(p) p.start() map(lambda p: p.join(), jobs) ## -- End pasted text -- Worker: 2 Worker: 1 Worker: 0 Worker: 3 In [128]: 

En cuanto a por qué esto no funciona en IDLE, vea esta respuesta :

Sin embargo, para ver el resultado de print , al menos en Windows, uno debe iniciar IDLE desde una consola como tal.

 C:\Users\Terry>python -m idlelib hello bob 

(Use idlelib.idle en 2.x.) La razón es que IDLE ejecuta el código de usuario en un proceso separado. Actualmente, la conexión entre el proceso IDLE y el proceso del código de usuario se realiza a través de un socket. La bifurcación hecha por multiprocesamiento no duplica ni hereda la conexión de socket. Cuando IDLE se inicia a través de un ícono o un Explorador (en Windows), no hay ningún lugar al que ir la salida de impresión. Cuando se inicia desde una consola con python (en lugar de pythonw ), la salida va a la consola, como se pythonw arriba.

Probablemente necesites vaciar la salida. Puedes usar sys.stdout.flush() :

 import multiprocessing import sys def worker(num): """thread worker function""" print('Worker:', num) sys.stdout.flush() return if __name__ == '__main__': jobs = [] for i in range(4): p = multiprocessing.Process(target=worker, args=(i,)) jobs.append(p) p.start()