2009-05-29 18 views
16

este código de ejemplo las obras (que puede escribir algo en el archivo):cola de python y cola de multiprocesamiento: ¿cómo se comportan?

from multiprocessing import Process, Queue 

queue = Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

lugar esta otra muestra no: (errormsg: 'módulo' objeto no es exigible)

import Queue 

queue = Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

esta otra muestra no (no puedo escribir algo en el archivo):

import Queue 

queue = Queue.Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

¿Alguien puede explicar las diferencias? y el derecho a hacer?

+2

una nota: también puede importar como esto: "de cola de importación de colas" - de esta manera usted será capaz de llamar Queue.Queue que ha intentado la primera vez - "Cola()" – Bob

Respuesta

46

Para su segundo ejemplo, usted ya dio la explicación usted mismo --- Queue es un módulo, que no se puede llamar.

Para el tercer ejemplo: supongo que usa Queue.Queue junto con multiprocessing. A Queue.Queue no se compartirá entre procesos. Si se declara el Queue.Queue antes de los procesos, cada proceso recibirá una copia del mismo, que es independiente de cualquier otro proceso. Los artículos colocados en el Queue.Queue por el padre antes de comenzar a los niños estarán disponibles para cada niño. Los artículos colocados en el Queue.Queue por el padre después de iniciar el niño solo estarán disponibles para el padre. Queue.Queue está hecho para el intercambio de datos entre hilos diferentes dentro del mismo proceso (utilizando el módulo threading). Las colas de multiprocesamiento son para el intercambio de datos entre diferentes procesos de Python . Si bien el API se ve similar (está diseñado para ser de esa manera), los mecanismos subyacentes son fundamentalmente diferentes.

  • multiprocessing colas de intercambiar datos por decapado (serializar) los objetos y enviarlos a través de tuberías.
  • Queue.Queue utiliza una estructura de datos que se comparte entre subprocesos y bloqueos/exclusiones mutuas para un comportamiento correcto.
+3

Debido a esta comportamiento un multiprocesamiento.Queue arrojará una copia de lo que ingresó, mientras que una cola.Queue arrojará una referencia a lo que ingresó. Para mí, esto no estaba del todo claro en la documentación. – Pelle

Cuestiones relacionadas