Frage zu Thread-Design (kein Code)
-
Guten Morgen
Ich habe schon länger nicht mehr mit Threads gearbeitet und wollte hier meine Idee vorstellen, um ein Problem zu lösen. Von euch würde ich gerne wissen, ob ihr die Idee als angemessen/gut bewertet, oder was ihr anders machen würdet.
Szenario:
Ein Programm empfängt Daten über ein Netzwerk. Parallel dazu rechnet das Programm dauerthaft mit anderen Daten, die lokal vorliegen. Liegen Netzwerkdaten für den aktuellen Berechnungsschritt vor, so gehen diese in die Berechnung mit ein. Am Anfang muss das Programm allerdings einmal einen Befehl über das Netzwerk erhalten, um mit den Berechnungen zu beginnen.Meine Idee:
Es gibt einen Thread, der von der Netzwerkschnittstelle liest. Dieser Thread hat noch eine Conditionvariable. Die sorgt dafür, dass das Hauptprogramm erstmal solange blockt (wait()), bis der Thread die ersten Netzwerkdaten empfängt und "notify()" auslöst.Anschließend werden etwaige weitere Netzwerkdaten vom Thread in eine threadsafe queue geschrieben. Im Hauptprogramm wird am Anfang von jedem Berechnungsschritt geprüft, ob Daten in dieser Queue enthalten sind und ggfs. ausgelesen.
Was haltet ihr von meinem Ansatz
?
-
Grundsätzlich schon ok, fragt sich nur wie viel Performance bei der queue hängen bleibt. Ich würde jedenfalls mal ein Blick auf asynchrone Modelle werfen. Aber solange da nicht sehr viele kleine Sachen zwischen den Threads "getauscht" werden müssen, sollte der Unterschied nicht allzu groß sein.
Im Hauptprogramm wird am Anfang von jedem Berechnungsschritt geprüft, ob Daten in dieser Queue enthalten sind und ggfs. ausgelesen.
Wie groß sind die Schritte denn? Sehr oft würde ich da nicht rein gucken.
Aber was soll das eigentlich für ein Algorithmus sein, der Informationen aus dem Netzwerk irgendwie so einfließen lässt wie sie ankommen?
-
cooky451 schrieb:
Grundsätzlich schon ok, fragt sich nur wie viel Performance bei der queue hängen bleibt. Ich würde jedenfalls mal ein Blick auf asynchrone Modelle werfen.
Ich würde sagen: ohne genaueres über die Applikation zu wissen, speziell auch darüber mit welcher Frequenz da Daten über's Netz ankommen etc., kann man nicht gut einschätzen ob es sich überhaupt auszahlt da irgendwelche alternativen Implementierungen anzusehen.
Mein Bauchgefühl sagt mir aber: da wird wohl sowieso nicht viel drin sein, also erstmal die einfache Variante implementieren.
-
Der Ansatz ist im Prinzip Ok.
Man nennt das ein Active Object, eines der Concurrency Pattern. Schau Dir vor allem die Referenzen an, auf die die Wiki-Seite verweist. Da sind mehr Details zu finden.Gruß
Werner