Socket Thread Pooling

Helgon

Bekanntes Mitglied
Hey, ich hab folgende Frage/Problem.

In JavaInsel5 wird ganz kurz was von wegen Thread Pools erzählt (nur kurz angerissen)

JavaInsel5 hat gesagt.:
Ein anderer Punkt ist die Tatsache, dass Server im Allgemeinen multithreaded ausgelegt sind, damit sie mehrere Anfragen gleichzeitig ausführen können. Die Threads werden nicht pro Anfrager erzeugt, da dies zu teuer ist, sondern einem Thread-Pool entnommen. Mit Java 5 gibt es hierfür die Thread-Pool-Klasse, die diese Arbeit vorzüglich bewältigt.

Also mal gegoogelt und herausgefunden was das eigentlich genau ist und wofür man es verwendet etc.

Dann hab ich nach Beispielen gesucht und bin auch wieder hier gelandet (alter Thread) und dann wurde dort gesagt, dass man für so etwas (Thread Pooling) Frameworks wie Netty oder Mina verwendet.

Dann stellen sich mir ein paar Fragen. Laut dem was ich so gelesen hab macht es irgendwie gar kein Sinn überhaupt auf Thread-Pooling zu verzichten?! Oder hat es irgendwelche Nachteile gegenüber normalem Multithreading?

Und bei was für "Größenordnungen" verwendet man Netty oder Mina? Immer? Auch wenn ich nur irgend ein kleines Multiplayer Snake bastel (nurn Beispiel bezüglich der Komplexität), oder reicht es dort vollkommen aus wenn man dieses Thread Pooling selbst implementiert?

Grüße
 
Netty und Mina bieten deutlich mehr als einen Thread Pool!

Auch wenn es nie verkehrt ist sich mit solchen Frameworks zu beschäftigen - für ein simples kleines Spielchen braucht man sie nicht unbedingt. Aber ich finde das man in der Regel schneller mit Netty das Netzwerkstack eines Spieles zusammen gebaut hat als wenn man vom Socket rauf alles selber machen muss.

Multithreading brauchst du sobald du mit non blocking sockets arbeiten willst. Und dann ist es in der Regel auch sinnvoll Thread Pools zu verwenden.
 
Danke für die Antwort.

Aus dem letzten Satz schließe ich dann mal, was ich schon vermutet habe: Eigentlich immer Thread Pooling verwenden?

Grüße
 
Sobald ich mehr mehr als einen Thread brauche (Server für mehrere Clients) würde ich mit einem Thread Pool arbeiten.

Ich nehme aber eigentlich für alles Netty und sorge mich da nicht weiter drum 😉

Hab einmal ein eigenes NIO Socket Framework geschrieben - danach nie wieder...
 
Würde auch zu ExecuterService's (ThreadPools) raten.

Immer dran denken, dass Aufgaben die "zusammengehören", sprich Ressourcen teilen IMMER im selben Thread ausgeführt werden sollten. Es gibt nur eine Sache die "teurer" ist als Synchronisation und das ist Thread-Kontextwechsel. Sprich wenn ein Thread die Arbeit eines anderen Threads übernimmt oder anders ausgedrückt:

Du hast ein komplexes Problem das sagen wir 10 min braucht. Nun willst du das in Häppchen zerlegen und immer nur alle 100 ms daran weiterarbeiten, damit vlt andere Probleme parallel ausgeführt werden können. Dann versuche alle 100ms dafür DEN SELBEN Thread zu nehmen und NICHT einen, der vlt grad nichts zu tun hat. Das interne Thread-Scheduling explodiert sonst und deine Thread tauschen nur noch ihre lokalen Caches aus und das Programm stellt sich selbst ein bein 😉

Macht Netty und Mina intern auch so. Jeder Client wird von EINEM Thread bedient. Jeder Thread kann beliebig viele Clienten haben. Die interne Verwaltung sorgt dafür, dass jeder Thread möglichst gleiche viele Clienten hat.
 
Danke für die Antwort. Wieder was gelernt und es erleuchtet mich 🙂

Dann mal ne andere Frage.

Ich möchte als Übung ein kleines Spiel schreiben (übe dann gleichzeitig auch OpenGL 🙂).

Ich weis, dass es dazu bereits einige Threads gibt (werde die SuFu gleich mal bemühen), aber wenn der Thread hier eh schon offen ist, stelle ich mal die Frage ob auch in diesem Fall Thread-Pooling angebracht ist.

Soweit ich das auf einer englischsprachigen Seite verstanden hab, legt man ja mit Thread-Pooling auch die maximalen, parallelen Zugriffe fest. Verwendet man Thread-Pooling also auch in einem Spiel (um z.B. die maximale Spieleranzahl auf einem Server) zu limitieren?


Grüße
 
In Spielen ist das nur begrenzt einsetzbar. Also klar, im Netzwerkpart des Servers auf jeden Fall. Aber für das Spiel selbst könnte man höchstes Dinge auslagern wie Modelloading/TextureLoading. OpenGL ist nämlihc nicht Threadsafe. Sprich wenn man einmal OpenGL initialisiert hat, sind alle Befehle auch nur in diesem Thread gültig. In sofern ist alles was mit Rendern zu tun hat (Spiel, GUI, etc.) nicht auslagerbar.
 

Neue Themen


Zurück
Oben