La función simple de multiprocesamiento de Python en Spyder no produce resultados

Tengo esta función muy simple aquí en la que estoy tratando de ejecutar y probar, sin embargo, no genera nada y tampoco tiene errores. He comprobado el código varias veces pero no tiene ningún error.

Imprimí trabajos y esto es lo que obtuve:

[, , , , ] 

Aquí está el código:

 import multiprocessing def worker(num): print "worker ", num return jobs = [] for i in range(5): p = multiprocessing.Process(target = worker, args = (i,)) jobs.append(p) p.start() 

Aquí está el resultado que estoy esperando pero no está generando nada:

 Worker: 0 Worker: 1 Worker: 2 Worker: 3 Worker: 4 

Los comentarios revelaron que OP usa tanto Windows como Spyder. Como Spyder redirige stdout y Windows no admite el forking , un nuevo proceso secundario no se imprimirá en la consola de Spyder. Esto se debe simplemente al hecho de que la sys.__stdout__ del nuevo proceso hijo es la sys.__stdout__ Python’s vanilla, que también se puede encontrar en sys.__stdout__ .

Hay dos alternativas:

  1. Usando el módulo de registro . Esto abarcaría la creación y el registro de todos los mensajes en uno o varios archivos. El uso de un único archivo de registro puede llevar al problema de que la salida está ligeramente distorsionada, ya que los procesos se escribirían simultáneamente en el archivo. Usando un solo archivo por proceso podría resolver esto.

  2. No usar la print dentro de los procesos secundarios, sino simplemente devolver el resultado al proceso principal. Ya sea utilizando una cola (o multiprocessing.Manager().Queue() ya que no es posible realizar bifurcaciones) o más simplemente confiando en la funcionalidad del map del Pool de multiprocesamiento , vea el ejemplo a continuación.

Ejemplo de multiprocesamiento con un pool:

 import multiprocessing def worker(num): """Returns the string of interest""" return "worker %d" % num def main(): pool = multiprocessing.Pool(4) results = pool.map(worker, range(10)) pool.close() pool.join() for result in results: # prints the result string in the main process print(result) if __name__ == '__main__': # Better protect your main function when you use multiprocessing main() 

que imprime (en el proceso principal)

 worker 0 worker 1 worker 2 worker 3 worker 4 worker 5 worker 6 worker 7 worker 8 worker 9 

EDITAR: Si está impaciente por esperar a que finalice la función de map , puede imprimir inmediatamente sus resultados usando imap_unordered y cambiando ligeramente el orden de los comandos:

 def main(): pool = multiprocessing.Pool(4) results = pool.imap_unordered(worker, range(10)) for result in results: # prints the result string in the main process as soon as say are ready # but results are now no longer in order! print(result) # The pool should join after printing all results pool.close() pool.join()