2012-07-17 13 views
41

Tengo muchos problemas para tratar de entender cómo funciona la cola de multiprocesamiento en python y cómo implementarla. Digamos que tengo dos módulos de Python que acceden a datos de un archivo compartido, llamemos a estos dos módulos escritor y lector. Mi plan es que el lector y el escritor coloquen las solicitudes en dos colas de multiprocesamiento separadas, y luego hagan que un tercer proceso muestre estas solicitudes en un bucle y se ejecuten como tales.Cómo usar la cola de multiprocesamiento en Python?

Mi problema principal es que realmente no sé cómo implementar multiprocesamiento.queue correctamente, realmente no se puede crear una instancia del objeto para cada proceso, ya que serán colas separadas, ¿cómo se asegura de que todos los procesos se relacionen con un cola compartida (o en este caso, las colas)

+3

pase las colas a cada clase de proceso como un parámetro cuando crea una instancia en el proceso principal. –

Respuesta

57

Mi problema principal es que la verdad es que no sé cómo implementar multiprocessing.queue correctamente, realmente no se puede crear una instancia del objeto para cada proceso, ya que será colas separadas , ¿cómo se asegura de que todos los procesos se relacionen con una cola compartida (o en este caso, las colas)

Este es un ejemplo simple de un lector y escritor que comparten una sola cola ... El escritor envía un montón de enteros al lector; cuando el escritor se queda sin números, envía 'DONE', que le permite al lector saber que se salga del ciclo de lectura.

from multiprocessing import Process 
from queue import Queue 
import time 

def reader(queue): 
    ## Read from the queue 
    while True: 
     msg = queue.get()   # Read from the queue and do nothing 
     if (msg == 'DONE'): 
      break 

def writer(count, queue): 
    ## Write to the queue 
    for ii in xrange(0, count): 
     queue.put(ii)    # Write 'count' numbers into the queue 
    queue.put('DONE') 

if __name__=='__main__': 
    for count in [10**4, 10**5, 10**6]: 
     queue = Queue() # reader() reads from queue 
          # writer() writes to queue 
     reader_p = Process(target=reader, args=((queue),)) 
     reader_p.daemon = True 
     reader_p.start()  # Launch reader() as a separate python process 

     _start = time.time() 
     writer(count, queue) # Send a lot of stuff to reader() 
     reader_p.join()   # Wait for the reader to finish 
     print "Sending %s numbers to Queue() took %s seconds" % (count, 
      (time.time() - _start)) 
+6

Gran ejemplo. Al igual que un poco más de información para abordar la confusión del OP ... Este ejemplo muestra que una cola compartida debe originarse desde el proceso maestro, que luego se pasa a todos sus subprocesos. Para que dos procesos completamente independientes puedan compartir datos, deben comunicarse a través de algún dispositivo de red central o asociado (por ejemplo, sockets). Algo tiene que coordinar la información. – jdi

+4

buen ejemplo ... también soy nuevo en este tema ... si tengo múltiples procesos ejecutando la misma función de destino (con diferentes argumentos), cómo asegurarme de que no choquen mientras pongo los datos en la cola ... es el bloqueo ¿necesario? – WYSIWYG

+0

@bharat_iyengar De la documentación del módulo de multiprocesamiento, dice que Queue se implementa utilizando algunos bloqueos/semáforos. Entonces, cuando usa los métodos get() y put (object) Queue, la cola se bloqueará si algún otro proceso/thread intenta obtener o poner algo en la cola. Por lo tanto, no tiene que preocuparse por bloquearlo manualmente. – almel

1

en "from queue import Queue" no hay ningún módulo llamado queue, en su lugar se debe usar multiprocesamiento. Por lo tanto, debe verse como "de la cola de importación de multiprocesamiento"

+0

https://docs.python.org/3/library/queue.html – Jakub

Cuestiones relacionadas