Seite 1 von 1

inter thread / inter process Kommunikation...

Verfasst: Sonntag 10. August 2014, 21:20
von jens
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.

Re: inter thread / inter process Kommunikation...

Verfasst: Sonntag 10. August 2014, 22:01
von EyDu
Queues sind schon der einfachste und übliche Weg. Je nach Problemstellung bieten sich noch Events und Shared Memory an.

Re: inter thread / inter process Kommunikation...

Verfasst: Sonntag 10. August 2014, 23:33
von snafu
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.

Re: inter thread / inter process Kommunikation...

Verfasst: Montag 11. August 2014, 11:52
von jens
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?

Re: inter thread / inter process Kommunikation...

Verfasst: Dienstag 12. August 2014, 11:41
von snafu
Als Alternative zu Warteschlangen mit nur einem Element könnte man auch einfach die vom `subprocess`-Modul angebotenen Pipes zur Kommunikation nutzen.

Re: inter thread / inter process Kommunikation...

Verfasst: Dienstag 12. August 2014, 12:32
von 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.

Re: inter thread / inter process Kommunikation...

Verfasst: Dienstag 12. August 2014, 16:50
von jens
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...

Re: inter thread / inter process Kommunikation...

Verfasst: Dienstag 12. August 2014, 22:30
von jerch
@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.