2009-05-29 29 views
16

questo funziona codice di esempio (posso scrivere qualcosa nel file):coda python e coda multiprocessing: come si comportano?

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() 

invece quest'altra campione non: (ErrorMsg: 'modulo' oggetto non è invocabile)

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() 

questo altro campione non (non posso scrivere qualcosa nel file):

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() 

Qualcuno può spiegare le differenze? e il diritto di fare?

+2

nota a margine: è anche possibile importare in questo modo: "dalla coda di importazione coda" - in questo modo si sarà in grado di chiamare Queue.Queue come si è tentato per la prima volta - "Queue()" – Bob

risposta

46

Per il tuo secondo esempio, hai già fornito tu la spiegazione --- Queue è un modulo, che non può essere chiamato.

Per il terzo esempio: presumo che si utilizzi Queue.Queue insieme a multiprocessing. A Queue.Queue non verrà condiviso tra i processi. Se lo Queue.Queue viene dichiarato prima dei processi, ogni processo riceverà una copia che è quindi indipendente da ogni altro processo. Gli articoli inseriti nello Queue.Queue dal genitore prima di iniziare i bambini saranno disponibili per ogni bambino. Gli elementi inseriti nello Queue.Queue dal genitore dopo l'avvio del figlio saranno disponibili solo per il genitore. Queue.Queue viene creato per lo scambio di dati tra diversi thread all'interno dello stesso processo (utilizzando il modulo threading). Le code di multiprocessing sono per lo scambio di dati tra diversi processi Python . Mentre l'API sembra simile (è progettata in questo modo), i meccanismi sottostanti sono fondamentalmente diversi.

  • multiprocessing le code scambiano dati mediante il decapaggio (serializzazione) di oggetti e l'invio tramite pipe.
  • Queue.Queue utilizza una struttura dati condivisa tra thread e blocchi/mutex per un comportamento corretto.
+3

A causa di questo comportamento a multiprocessing.Queue produrrà una copia di ciò che si inserisce, mentre una coda.Queue produrrà un riferimento a ciò che si inserisce. Per me questo non era completamente chiaro dalla documentazione. – Pelle

Problemi correlati