2009-03-24 15 views
8

Esiste una sintassi incorporata in python che mi permetta di inviare un messaggio a un thread python specifico all'interno del mio problema? Come "segnale connesso in coda" in pyQt o :: PostMessage() in Windows. Ho bisogno di questo per la comunicazione asincrona tra le parti del programma: c'è un numero di thread che gestiscono gli eventi di rete e hanno bisogno di postare questi eventi su un singolo thread 'logico' che traduce gli eventi in modo sicuro a thread singolo.Esistono eventi cross-thread incorporati in python?

risposta

10

Il modulo Queue è python che ben si adatta a ciò che si sta descrivendo.

È possibile impostare una coda condivisa tra tutti i thread. I thread che gestiscono gli eventi di rete possono utilizzare queue.put per inviare eventi sulla coda. Il thread logico utilizza queue.get per recuperare gli eventi dalla coda.

import Queue 
# maxsize of 0 means that we can put an unlimited number of events 
# on the queue 
q = Queue.Queue(maxsize=0) 

def network_thread(): 
    while True: 
     e = get_network_event() 
     q.put(e) 

def logic_thread(): 
    while True: 
     # This will wait until there are events to process 
     e = q.get() 
     process_event(e) 
+0

Grazie! è un modo per inserire una chiamata di funzione all'interno di un evento? Funzioni di chiamata codice thread reali, come PostConnectionStatus (STATUS) e thread di lavoro con gestori come OnConnectionStatus (i_status). È in qualche modo possibile effettuare il marshalling delle chiamate automaticamente con un evento? – grigoryvp

+0

In Python, le funzioni sono oggetti come tutto il resto e quindi possono essere passate come gli altri oggetti. Pertanto, è possibile allegare una funzione da chiamare con l'evento, ad esempio q.put ((e, PostConnectionStatus)). Il thread logico potrebbe quindi eseguire "e, func = q.get()". Questo aiuto? –

+0

sicuro, grazie. Il numero variabile di argomenti può essere eseguito nello stesso modo? – grigoryvp

1

Non sono proprio sicuro di cosa stiate cercando. Ma non esiste certamente una sintassi integrata per questo. Dai uno sguardo ai moduli queue e threading. Ci sono molte cose utili come code, condizioni, eventi, serrature e semafori che possono essere utilizzate per implementare ogni tipo di comunicazione sincrona e asincrona.

+0

sto cercando un modo semplice per chiamare una funzione in un thread e la funzione collegata verrà chiamata in un altro thread (delegato in coda). Le primitive di sincronizzazione forzeranno a fare tutto 'a mano' che è un sacco di codice? – grigoryvp

+1

@Eye of Hell: Si prega di leggere effettivamente la documentazione del modulo code. Quello che sembra essere "chiamare una funzione" tra i thread è solitamente una coda di richieste passate da un thread all'altro; il thread di ricezione rimuove la richiesta e chiama la funzione. –

+0

ah, ricordo, la funzione è un oggetto di prima classe in python? (delegati incorporati). È una sintassi nota a weel per mettere in coda una "chiamata di funzione" e fare una chiamata effettiva su dequeue nel thread attuale? E per quanto riguarda gli argomenti della funzione marshalling? – grigoryvp

Problemi correlati