inter thread / inter process Kommunikation...

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wie kann man am einfachsten mit einem anderen Thread (oder auch process) Kommunizieren?

Eigentlich habe ich eine erste Lösung fertig:
https://github.com/jedie/DragonPy/commi ... 9fa62551ac

Funktioniert auch. Aber geht das nicht einfacher?

Wobei im Grunde ist es recht einfach:
Ich habe zwei Queue:

Code: Alles auswählen

request_queue = Queue.Queue(maxsize=1)
response_queue = Queue.Queue(maxsize=1)
Der Main-Thread packt in request_queue eine Anfrage.
Der Sub-Thread schaut ständig in request_queue nach neuen Anfragen, wenn was da ist, packt er die Antwort in response_queue rein.

Prinzipell sollte das ganze auch mit Multiprocessing Funktionieren. Dazu brauche ich ja nur Queue.Queue durch multiprocessing.Queue tauschen.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Queues sind schon der einfachste und übliche Weg. Je nach Problemstellung bieten sich noch Events und Shared Memory an.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jens hat geschrieben:Prinzipell sollte das ganze auch mit Multiprocessing Funktionieren. Dazu brauche ich ja nur Queue.Queue durch multiprocessing.Queue tauschen.
Bedenke aber, dass dann die Berechnung eines Elementes für die Queue aufwändiger sein sollte als der IO-Overhead für den Informationsaustausch zwischen den Prozessen, damit ein solcher Ersatz sinnvoll ist.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja das weiß ich. In diesem Fall geht es allerdings nur um Benutzer anfragen. So was kommt ja nicht ständig vor.

Ist das mit den zwei queue üblich?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Als Alternative zu Warteschlangen mit nur einem Element könnte man auch einfach die vom `subprocess`-Modul angebotenen Pipes zur Kommunikation nutzen.
BlackJack

Wobei ich mich frage was die Begrenzung auf ein Element soll. Wenn die Anfragen tatsächlich nicht häufig vorkommen, dann wird es auch ohne Begrenzung sehr selten mehr als ein Element in der Schlange geben. Und Falls mehr als eins abgearbeitet werden müssen, wäre es doch nett wenn die Antwort auf die erste Anfrage nicht blockieren würde bis die andere Seite sie abholt, sondern schon die nächste Antwort bearbeitet werden könnte.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hm... Die Idee war das request und response immer zusammenpassen... Was ist, wenn der user schnell hintereinander auf irgendwas klickt, was requests erstellt. Wenn dann die zweite Anfrage schneller als die erste ist, kommt da ganze evtl durcheinander...

Wobei,wenn ich es mir genau überlege wäre deswegen vielleicht eine queue besser?!?

Ich glaub ja nicht das ich der einzige bin,der hier eine Lösung sucht. Deswegen die eingangsfrage ob es nicht was fertiges gibt...

Bzw. Irgendwie hat das ganze Ähnlichkeiten mit einer http Rest-API...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@jens:
Wenn Du auf beiden Seiten stateful bist und Request/Respone davon abhängen, musst Du auch die Abarbeitung serialisieren.

Suchst Du jetzt was Fertiges oder was Schnelles? Bzgl. Python dürften Queues das beste Fertige sein, wenn es um Geschwindigkeit geht, ist bei IPC shared memory wahrscheinlich das Schnellste. Pipes dürften noch gut flott sein, Sockets aufgrund des Netzwerkstacks etwas lahmer.
Antworten