Effizienz der while(true) ServerSocket Hören
Frage ich mich, ob eine typische while(true)
ServerSocket hören Schleife nimmt einen ganzen Kern, zu warten und zu akzeptieren, eine client-Verbindung (Auch bei der Implementierung von runnable und Verwendung Thread .start()
)
Ich die Umsetzung eine Art von distributed computing cluster und jeder computer braucht jeder Kern hat es für die Berechnung. Ein Master-Knoten benötigt für die Kommunikation mit diesen Rechnern (Aufruf von statischen Methoden, das ändern des Algorithmus funktionieren).
Der Grund, warum ich brauchen, um sockets verwenden, ist aufgrund der cross-Plattform /cross-language-Fähigkeiten. In einigen Fällen wird PHP Aufruf dieser java statische Methoden.
Habe ich eine java-profiler (YourKit) und ich kann sehen, meine läuft ServerSocket listen-thread und es schläft nie und es ist immer mit. Gibt es eine bessere Methode das zu tun, was ich will? Oder wird die Leistung Treffer vernachlässigbar sein?
Bitte fühlen Sie sich frei zu bieten jede Anregung, wenn Sie sich vorstellen können, einen besseren Weg (ich habe versucht, RMI, aber es wird nicht unterstützt cross-Sprache.
Danke an alle
- Damit sollte nicht passieren, wenn Sie ‘akzeptieren‘. Kannst du etwas code?
- erickson war genau auf den Punkt mit dem code, den er geschrieben while (true) { Socket socket = server.accept(); /* Tu was mit sockel... */ }
- Wie viele verbindungen/Sekunde sind Sie die Handhabung?
- Jetzt, nicht viele. Jedoch, das könnte leicht in ein Dutzend oder so. Die Informationen, die übertragen wird, ist sehr klein, so sollte es nicht sein, viele gleichzeitige aktive sockets
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du meinst so etwas wie dieses:
dann, Nein, den Anruf zu
accept()
nicht "nehmen Sie einen ganzen Kern." Es ist ein blockierender Aufruf, dass die CPU eingeplant werden für einen anderen thread, bis sich ein client verbindet. Wenn der Ruf zumaccept()
gibt, ist der aktuelle thread ausgeführt werden soll, und die CPU bis er blockiert aufaccept()
in der nächsten iteration der Schleife.Zu vermeiden, die Zuhören Rückstand der anderen Kunden, es zu umfangreich wird, ein anderer thread in der Regel übernimmt die Interaktion mit dem neu-akzeptiert
Socket
, so dass ein thread, um den Fokus auf die Annahme neuer Kunden. Die socket-Handhabung thread vielleicht handhaben Sie viele sockets, Verwendung von NIO oder könnte es sein, der sich in einer single-socket -, die viel einfacher ist code, der aber nicht gut skalieren Vergangenheit viele Hunderte von gleichzeitigen verbindungen.Möchten Sie vielleicht einen Blick auf die Java 1.4 nio-Bibliotheken und insbesondere ServerSocketChannel. Ich nutze dieses sehr erfolgreich zu implementieren, die eine effiziente server, die Schlüssel-bits code:
Und der Hörer ist nur eine Schleife, die läuft:
Grundsätzlich der profiler ist irreführend Sie.
Ich davon aus, dass Ihr code wie folgt aussieht:
Diese nicht verbrauchen signifikante CPU ... es sei denn, Sie haben etwas getan, pathologischen, wie der Aufruf
ServerSocket.setSoTimeout(int)
mit einem kleinen timeout.Lassen den Kern ein wenig schlafen. In Ihr Ablaufenden Methode, fügen Sie so etwas wie
in jeder Schleife.
Sollten deutlich reduzieren die CPU-Auslastung
Edit: schlechte Idee, siehe Kommentare, sorry, mein Fehler
Und: verwenden Sie nicht while(true). es ist schrecklich design, wie die Semantik suggerieren, die schließlich wahr werden nicht mehr wahr. In der Regel werden Sie wollen, um die Abfrage einige flüchtige oder Atomare variable aus der main-thread
Diese Weise kann der Haupt-thread hat einen Weg, um den listener zu beenden thread.
while (true)
inside der try-block mit der catch fürInterruptedException
.