threading.Event --> Event ID mitgeben!?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
antaeus
User
Beiträge: 48
Registriert: Dienstag 19. September 2006, 10:10

Erstmal allseits ein "gutes Neues". Ich hoffe ihr seid gut gerutscht und weich gelandet ;-)

Ich habe eine "Art" von Produzenten / Konsumenten Problem... Das "Herzstück" meines Codes bildet ein Thread. Dieser Thread besitzt wiederum mehrere andere Threads in einem Pool, die für ihn unterschiedliche Aufgaben erbringen.

Meine Vorstellung ist, dass der "Hauptthread" ein Event-Objekt besitzt und jedem von ihm instanziierten Thread eine Referenz auf dieses Event-Objekt übergibt, den Thread startet und sich dann "schlafen legt" (event.wait()). Hat nun ein Thread ein Ergebnis für den Hauptthread, löst er das Event-Objekt aus (event.set()).

Meine Frage ist nun: Wie erkennt der "Hauptthread", welcher der Threads ihn geweckt hat? Kann ich dem event-Objekt irgendwie eine Art Absender-ID mitgeben oder brauche ich dazu noch eine weitere Variable "id" im Hauptthread, die ebenfalls an jeden Thread als Referenz übergeben wird und von einem Thread mit seiner ID "beschrieben" wird?

Viele Grüße!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

antaeus hat geschrieben:Kann ich dem event-Objekt irgendwie eine Art Absender-ID mitgeben
Hi antaeus!

Das geht mit dem Event-Objekt nicht. Allerdings könntest du eine Queue verwenden. Mit Hilfe eines Queue-Objektes kannst du Objekte in eine Warteschlange legen. Ein Thread kann so lange warten, bis etwas in die Warteschlange gelegt wurde....

Suche hier im Forum nach "Queue" für Beispiele.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
antaeus
User
Beiträge: 48
Registriert: Dienstag 19. September 2006, 10:10

Ok, vielen Dank für den Tip - muss mal nachschauen wie das geht!

Ich sehe allerdings gerade nicht, was der Vorteil dieser Queue ist - insbesondere wie sie mir helfen soll, zu erkennen, wer das Event ausgelöst hat!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

antaeus hat geschrieben:Ich sehe allerdings gerade nicht, was der Vorteil dieser Queue ist - insbesondere wie sie mir helfen soll, zu erkennen, wer das Event ausgelöst hat!
Hi antaeus!

Du kannst an die Queue das auslösende Objekt oder die Thread-ID übergeben. Diese wird dann vom verarbeitenden Thread ausgelesen.

Eine Objekt vom Type ``Queue.Queue`` ist so etwas wie ein ``Threading.Event``. Ein Event hat den Vorteil, dass man den Code an einer Stelle stehen lassen kann, bis das Event ausgelöst wurde. Erst dann wird die Codeausführung fortgesetzt.

Eine Queue ist auch so etwas wie ein Event. Du kannst die Codeausführung an einer Stelle stehen lassen, bis etwas in die Queue gefüllt wird. Erst wenn etwas in der Queue ist, wird die Codeausführung fortgeführt. Noch dazu wird im gleichen Schritt das, was in die Queue gegeben wurde, an den jetzt aktivierten Thread weitergegeben.

Du kannst also alles (auch die Thread-ID oder die Thread-Instanz selbst) in die Queue geben. Der Empfänger hat dann alles was er braucht, weil er es von der Queue übergeben bekommt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
antaeus
User
Beiträge: 48
Registriert: Dienstag 19. September 2006, 10:10

Hallo gerold!

Danke dir für die ausfühlrliche Antwort. Das klingt richtig gut und ich glaube, die Queue ist genau das, was ich brauche.

Wenn ich dich jetzt recht verstanden habe, brauche ich bei Verwendung der Queue auch kein Event Objekt mehr, um einen Worker zu wecken. Wenn also ein Producer ein Element in die Queue "gestopft" hat, d.h. der Producer macht ein queue.put, dann wacht der Worker auf, macht queue.get und bearbeitet den neuen input...?

Ich suche gerade im Netz nach einer Beschreibung, wie das Warten auf neue Queue-Elemente geschieht und habe in der Python Doku nachgelesen: http://docs.python.org/lib/QueueObjects.html, da findet sich die Info aber komischerweise nicht... Rein von dem, was du mir geschrieben hast, müsste mein Worker-Thread mit der Queue etwa so funktionieren:

Code: Alles auswählen

while 1:
  try:
    item = queue.get()
    do_work(item)
  except: Queue.Empty
    queue.wait()
Oder habe ich dich falsch verstanden!?

Noch ein Punkt: Zudem habe ich -wenn ich die o.g. Doku zur Queue recht verstehe- sozusagen implizit eine Art von Locking, das sicherstellt, dass keine mehreren Threads gleichzeitig auf ein und das selbe Element in der Queue zugreifen. Ist das so korrekt?


Viele Grüße,
antaues
antaeus
User
Beiträge: 48
Registriert: Dienstag 19. September 2006, 10:10

Ah, ok... Ich habe es jezt verstanden.

put() und get() blockieren sozusagen selbständig und warten, bis neue Elemente in der Queue sind...

Danke!
Antworten