2009-03-24 8 views
8

Gibt es eine eingebaute Syntax in Python, die es mir erlaubt, eine Nachricht an bestimmte Python-Thread innerhalb meines Problems zu posten? Wie 'in Warteschlange gestelltes Signal' in pyQt oder :: PostMessage() in Windows. Ich brauche dies für die asynchrone Kommunikation zwischen Programmteilen: Es gibt eine Reihe von Threads, die Netzwerkereignisse verarbeiten, und sie müssen diese Ereignisse in einen einzelnen "Logik" -Thread posten, der Ereignisse sicher Single-Threaded übersetzt.Gibt es in Python eingebaute Cross-Thread-Ereignisse?

Antwort

10

Das Queue Modul ist Python ist gut geeignet, was Sie beschreiben.

Sie könnten eine Warteschlange einrichten, die zwischen all Ihren Threads geteilt wird. Die Threads, die die Netzwerkereignisse verarbeiten, können queue.put verwenden, um Ereignisse in die Warteschlange zu stellen. Der Logik-Thread würde mit queue.get Ereignisse aus der Warteschlange abrufen.

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

Danke! ist es eine Möglichkeit, einen Funktionsaufruf in ein Ereignis einzufügen? Tatsächliche Threadcode-Aufruffunktionen, wie PostConnectionStatus (STATUS) und Worker-Thread, weisen Handler wie OnConnectionStatus (i_status) auf. Ist es möglich, Funktionsaufrufe automatisch mit einem Ereignis zu verknüpfen? – grigoryvp

+0

In Python sind Funktionen Objekte wie alles andere und können daher genau wie andere Objekte weitergegeben werden. Sie können also auch eine Funktion anhängen, die mit dem Ereignis aufgerufen wird, wie q.put ((e, PostConnectionStatus)). Ihr logischer Thread könnte dann "e, func = q.get()" tun. Hilft das? –

+0

sicher, danke. Variable Anzahl von Argumenten kann auf dieselbe Weise gemarshallt werden? – grigoryvp

1

Ich bin nicht wirklich sicher, wonach Sie suchen. Dafür gibt es aber keine eingebaute Syntax. Sehen Sie sich die Module queue und threading an. Es gibt eine Menge hilfreicher Dinge wie Warteschlangen, Bedingungen, Ereignisse, Sperren und Semaphore, die verwendet werden können, um alle Arten von synchronen und asynchronen Kommunikationen zu implementieren.

+0

Ich bin auf der Suche nach einer einfachen Möglichkeit, eine Funktion in einem Thread aufzurufen, und die verknüpfte Funktion wird in einem anderen Thread (in der Warteschlange eingereihter Delegat) aufgerufen. Synchronisations-Primitive werden alles von Hand machen, das ist viel Code? – grigoryvp

+1

@Eye of Hell: Bitte lesen Sie tatsächlich die Warteschlangenmodul-Dokumentation. Was als "Aufruf einer Funktion" zwischen Threads erscheint, ist normalerweise eine Warteschlange von Anforderungen, die von einem Thread an einen anderen übergeben werden; Der empfangende Thread entnimmt die Anforderung und ruft die Funktion auf. –

+0

ah, ich erinnere mich, Funktion ist ein erstklassiges Objekt in Python? (eingebaute Delegierte). Ist es eine wohlbekannte Syntax, um einen 'Funktionsaufruf' in die Warteschlange zu stellen und tatsächlich im aktuellen Thread aus der Warteschlange herauszuholen? Und was ist mit Funktionsargumenten? – grigoryvp

Verwandte Themen