2016-08-23 2 views
1

Ich versuche, Non-Blocking-Codebeispiel von diesem tutorial:Haben Nodejs Multithreading unter der Haube?

var fs = require("fs"); 

fs.readFile('input.txt', function (err, data) { 
    if (err) return console.error(err); 
    console.log(data.toString()); 
}); 

console.log("Program Ended"); 

gehe ich davon aus einzelnen Prozessor CPU haben. Wer verwaltet die CPU-Zeit zwischen callback function und console.log() Methode? Hat Nodejs Kern etwas wie Threadmanager unter der Haube? Wie funktioniert es?

Antwort

5

Obwohl LibUV (die Bibliothek, die das IO in node.js ausführt) definitiv einen kleinen Thread-Pool hinter den Kulissen verwendet, verwendet das nicht blockierende E/A selbst Threads nicht blockierend.

Kurz gesagt, weisen Sie das Betriebssystem an, eine nicht blockierende E/A-Aktion zu initialisieren. Das OS kommuniziert mit dem relevanten Treiber und gibt den Fluss dann an die Anwendung zurück. Der relevante Treiber arbeitet eigenständig, ohne das Threading-Modell zu verwenden. Wenn die E/A beendet ist, unterbricht der Treiber das Betriebssystem, das wiederum Ihrer Anwendung mitteilt, dass die E/A beendet wurde. Ihre Anwendung entfernt dann den zugehörigen Rückruf und startet ihn.

Der gesamte Mechanismus erfordert keine zusätzlichen Threads. Sie verwenden Threads zum Parallelisieren von CPU-basierten Tasks und asynchroner IO zum Parallelisieren von IO-basierten Tasks. derjenige, der die IO ist nicht die CPU, sondern eine spezialisierte Hardware + Treiber, und daher keine Notwendigkeit für zusätzliche Threads.

+1

Vorsicht, nicht alle (nicht blockierenden) E/A im Knoten werden ohne Threads ausgeführt. Vor allem Datei-E/A wird immer im Thread-Pool auf den meisten Plattformen ausgeführt. Auch 'dns.lookup()' (welcher Knoten verwendet intern um Adressen aufzulösen) wird derzeit im Thread-Pool durchgeführt. Allgemeine Netzwerk-E/A (z. B. das "Netz" -Modul) andererseits wird * ohne Threads überall ausgeführt. – mscdex

Verwandte Themen