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.
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