Node.js löst das Problem "Ein Thread pro Verbindung", indem das ereignisbasierte Modell im Kern verwendet wird und eine Ereignisschleife anstelle von Threads verwendet wird. Alle kostspieligen E/A-Vorgänge werden immer asynchron mit einem Rückruf ausgeführt, der ausgeführt wird, wenn der initiierte Vorgang abgeschlossen ist.
Die Beobachtung, ob eine Operation auftritt, wird durch Multiplexing-Mechanismen wie epoll () gehandhabt.
Meine Frage ist jetzt:
Warum blockiert NodeJS nicht, während das blockierende Systemcallsselect/epoll/kqueue verwendet wird?
Oder ist NodeJS überhaupt kein Threaded, so dass ein zweiter Thread ist
notwendig, um alle I/O-Operationen mit select/epoll/kqueue zu beobachten?
NodeJS ist evented (2. Zeile von website ), kein Singlethread. Er erledigt intern das Threading, das zur Auswahl von/epoll/kqueue erforderlich ist, ohne dass der Benutzer dies explizit verwalten muss.
Nein.
Wenn E/A-Operationen initiiert werden, werden sie an libuv delegiert, das die Anforderung in einer eigenen Umgebung (asynchrones Multithreading) verwaltet. libuv kündigt den Abschluss von E/A-Vorgängen an, wodurch alle auf dieses Ereignis wartenden Rückrufe erneut zur Ausführung in den V8-Hauptthread aufgenommen werden können.
V8 -> Delegate I/O ( libuv ) -> Thread-Pool -> Multi-Threaded-Async
JavaScript ist Singlethreading, ebenso das Ereignismodell. Der Knotenstapel ist jedoch kein Einzelthread.
Knoten verwendet die V8-Engine für Parallelität.