Упрощенное объяснение того, почему JavaScript является однопоточным:
Event Loop постоянно проверяет очередь, чтобы увидеть, есть ли какой-либо код, который должен быть запущен.
while (queue.waitForMessage()) {
queue.processNextMessage();
}
queue.waitForMessage()
является синхронным, поэтому ожидает поступления нового сообщения, если очередь в данный момент пуста. В среде JavaScript ни одна функция не может быть прервана. - как только функция начинает выполняться, она запускается до завершения, прежде чем будет выполнен любой другой код.
Node.js и V8
Такое же поведение встречается в любой среде JavaScript, а Node.js - это просто среда выполнения JavaScript, построенная на движке Chrome V8 JavaScript
Цикл событий Node.js
Конструкция Node.js Event Loop более сложна, чем я описал выше. Он состоит из нескольких этапов обработки FIFO очередей для таймеров и обратных вызовов, и именно эти элементы придают среде Node.js асинхронное поведение. Все операции ввода-вывода выгружаются в ОС, и поскольку базовая система является многопоточной, операции выполняются в фоновом режиме. Когда операция завершена, система уведомляет процесс Node.js, и в соответствующую очередь добавляется обратный вызов для ожидания выполнения. Более полное описание цикла событий Node.js доступно в разделе руководств официального веб-сайта Node.js и в документации библиотеки libuv , которая реализует асинхронный ввод-вывод. .