Quiero guardar el resultado de la tarea en una cola, las tareas se ejecutan en múltiples procesos. Después de realizar todas las tareas, lea el resultado de la cola.

¿Por qué el tamaño de la cola impreso en la tarea secundaria es correcto, pero en el proceso primario es 0? Además, no puedo obtener los datos de la cola en padre. ¿Cómo resolver esto?

Código en Python3:

import multiprocessing

que = multiprocessing.Queue()

def task(n):
    que.put(n)
    print("Child: queue len is %d" % que.qsize())

if __name__ == '__main__':
    pool = multiprocessing.Pool()
    pool.map(task, range(10))
    print("Parent: queue len is %d" % que.qsize())

Salida:

Child: queue len is 1
Child: queue len is 2
Child: queue len is 3
Child: queue len is 4
Child: queue len is 5
Child: queue len is 6
Child: queue len is 7
Child: queue len is 8
Child: queue len is 9
Child: queue len is 10
Parent: queue len is 0    // Why here is not 10??
0
chenchang 26 may. 2018 a las 18:25

1 respuesta

La mejor respuesta

Cuando ejecuta task en pool.map, se importa el módulo que contiene la función task y se llama a task con los argumentos que especificó en pool.map.

Entonces, la cola original no se le pasa. Cuando importa el módulo (en el otro proceso), se crea una nueva cola global.

Para que el comportamiento sea más evidente, modifiqué un poco su ejemplo, para que genere más procesos:

import multiprocessing
import time

que = multiprocessing.Queue()

def task(n):
    que.put(n)
    print("Child: queue len is %d" % que.qsize())
    time.sleep(0.1)

if __name__ == '__main__':
    pool = multiprocessing.Pool(10)
    pool.map(task, range(10))
    print("Parent: queue len is %d" % que.qsize())

Ahora imprime:

Child: queue len is 1
Child: queue len is 1
Child: queue len is 2
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Parent: queue len is 0

Para compartir la cola, tendría que pasarla a los otros procesos, pero no puede hacerse a través de map. Hay alternativas ofrecidas en varias otras respuestas SO, p.

Lo mejor en su caso depende de lo que realmente esté tratando de hacer con esa cola.

1
zvone 26 may. 2018 a las 15:56