7

Ich bin neu bei NodeJS und habe mich über das Einzelinstanzmodell von Node gewundert. Wird in einer einfachen nodeJs-Anwendung eine blockierende Operation asynchron mit Callbacks behandelt, verarbeitet der Hauptthread, der die nodeJs ausführt, ebenfalls den Callback? Wenn die Anforderung ist, einige Daten aus der Datenbank abzurufen, und es gibt 100 gleichzeitige Benutzer und jede db-Operation dauert einige Sekunden, wenn der Rückruf schließlich ausgelöst wird (für jede der Verbindungen), akzeptiert der Haupt-Thread diese Anforderungen, die auch zum Ausführen des Callbacks verwendet werden? Wenn ja, wie skaliert NodeJs und wie reagiert es so schnell ?.Nodejs Callback-Mechanismus - welcher Thread behandelt den Callback?

+0

Gefunden das wirklich hilfreich: http://rickgaribay.net/archive/2012/01/28/node-is-not-single-threaded.aspx – Rakesh

Antwort

9

Jede Instanz von nodejs wird in einem einzigen Thread ausgeführt. Zeitraum. Wenn Sie beispielsweise eine Netzwerkanforderung asynchron ausführen, wartet sie nicht darauf, weder in Ihrem Code noch an einem anderen Ort. Es hat eine Ereignisschleife, die durchläuft. Wenn die Antwort bereit ist, ruft sie Ihren Rückruf auf.

Dies kann unglaublich performant sein, weil es nicht viele Threads und den gesamten Speicheraufwand benötigt, aber es bedeutet, dass Sie darauf achten müssen, keine synchronen Blockierungskram zu machen.

Es gibt eine ziemlich anständige Erklärung der Ereignisschleife bei http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ und die ursprüngliche jsconf Präsentation von Ryan Dahl http://www.youtube.com/watch?v=ztspvPYybIY ist sehenswert. Haben Sie jemals einen Standing Ovation für eine technische Präsentation gesehen?

+1

Dies ist immer noch ein bisschen unklar für mich. Wenn also 100 gleichzeitige Benutzer vorhanden sind, wird nur eine Knoteninstanz oder 100? Ausgeführt. Wenn man bedenkt, dass es einen asynch-Aufruf mit einem Callback gibt, und der Thread (sagen threadA) diesen Code nach dem Platzieren der Netzwerk/DB-Anfrage beendet, wenn der Callback ausgelöst wird, ist es ThreadA, der diesen Callback ausführt ?. – Rakesh

+2

Ja. Wenn es 100 "gleichzeitige Benutzer" gibt (d. H. Benutzer, die Netzwerkanforderungen der Instanz nodejs machen), dann gibt es immer noch nur eine Knoteninstanz. Wenn die Anfrage gestellt wird, behandelt der einzelne Thread sie. Wenn es einen asynchronen Aufruf zum Lesen einer Datei oder zum Zugriff auf einen Netzwerkdienst oder was auch immer ausführt, ist es immer noch derselbe Thread. Wenn der Zugriff erfolgt und der Rückruf aufgerufen wird, ist es immer noch derselbe Thread. Sie * können * mehrere Modus-Instanzen ausführen lassen, wenn Sie sie mit einer Art Load-Balancer versehen können, und Knoten-Cluster ist geplant, ist aber immer noch experimentell. – deitch

+0

@Deitch Wie kann der einzige Thread nicht blockieren, wenn es 100 Dinge gleichzeitig tut? Sagen wir mal von den 100 Dingen, die jeweils 1 Sekunde dauern, wenn sie alle in 1 Thread sind, müssen sie in Serie gemacht werden, heißt das, dass es für 100 Sekunden blockiert wird? –

Verwandte Themen