2012-03-28 12 views
51

La documentación del módulo multiprocessing muestra cómo pasar una cola a un proceso iniciado con multiprocessing.Process. Pero, ¿cómo puedo compartir una cola con procesos de trabajo asíncronos iniciados con apply_async? No necesito una unión dinámica ni nada, solo una forma para que los trabajadores (repetidamente) informen sus resultados a la base.Compartir una cola de resultados entre varios procesos

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    q = multiprocessing.Queue() 
    workers = pool.apply_async(worker, (33, q)) 

Esta falla con: RuntimeError: Queue objects should only be shared between processes through inheritance. Entiendo lo que esto significa, y entiendo el consejo de heredar en lugar de exigir decapado/descabezado (y todas las restricciones especiales de Windows). Pero ¿cómo hacer Paso la cola de una manera que funciona? No puedo encontrar un ejemplo, y he probado varias alternativas que han fallado de varias maneras. ¿Ayuda por favor?

Respuesta

73

Intente utilizar multiprocessing.Manager para administrar su cola y también hacerla accesible para diferentes trabajadores.

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    m = multiprocessing.Manager() 
    q = m.Queue() 
    workers = pool.apply_async(worker, (33, q)) 
+0

¡Eso lo hizo, gracias! Hubo un problema no relacionado con la llamada asincrónica en mi código original, así que también copié el arreglo a su respuesta. – alexis

Cuestiones relacionadas