Как Node.js работает за сценой?

Опубликовано: 29 Июля, 2021

Node.js - это среда выполнения JavaScript, основанная на движке Google V8 Engine, т.е. с помощью Node.js мы можем запускать JavaScript вне браузера. Другие вещи, которые вы могли или не могли прочитать о Node.js, - это то, что он однопоточный, основан на архитектуре, управляемой событиями, и неблокирующий, основанный на модели ввода-вывода.

1) Архитектура Node.js: Node.js состоит из движка Chrome V8 , написанного на C ++ и Libuv , многоплатформенной библиотеки C, которая обеспечивает поддержку событий на основе асинхронного ввода-вывода в циклах событий и циклах потоков. Не волнуйтесь, это будет объяснено позже, в конце. Важно помнить, что, хотя Node.js создан с использованием движка V8 и Libuv, написанных на C или C ++, мы все равно можем использовать Node.js в чистом JavaScript.

2) Приложение Node.js: Итак, теперь, когда мы узнали об архитектуре Node.js, пришло время узнать, как работает приложение Node.js, и эта часть включает в себя концепцию однопоточного и непоточного Node.js. блокирующая природа тоже. Итак, прежде всего, что такое нить? Проще говоря, поток - это набор инструкций программирования, которые могут выполняться независимо в процессоре компьютера, и каждый процесс, который мы хотим запустить, имеет свой собственный поток для выполнения инструкций программирования, и процесс может иметь более одного потока. Но следует помнить, что приложение Node.js работает только в одном потоке, и это означает, что независимо от того, используется ли это приложение Node.js 5 пользователями или 5 миллионами пользователей, оно будет работать только в одном потоке, который делает приложение Node.js блокируемым (что означает, что одна строка кода может заблокировать все приложение, потому что используется только один поток). Итак, чтобы приложение Node.js работало, асинхронный код должен использоваться везде, где есть функции обратного вызова, потому что, как мы знаем, асинхронный код продолжает работать в фоновом режиме, а обратный вызов выполняется, как только выполняется обещание, а не синхронный код, который блокирует все приложение, пока оно не закончит выполнение. Но мы все еще можем использовать синхронный код, однако где-то в нашем приложении, и это место находится до того, как наше приложение войдет в цикл событий . Цикл событий - это то, что позволяет приложениям Node.js запускать неблокирующие операции на основе асинхронного ввода-вывода, то есть весь асинхронный код управляется и выполняется в цикле событий, а до этого мы можем использовать наш синхронный код, который находится в этом случай, известный как код верхнего уровня . Итак, попробуйте написать синхронный код только для тех операций, которые выполняются только один раз при запуске нашего приложения, а не каждый раз, например: чтение некоторых данных из памяти вашего компьютера, которые позже могут быть запрошены некоторым пользователем (много раз) в асинхронный код.

На следующем рисунке представлена диаграмма :

Итак, как вы можете видеть всякий раз, когда приложение Node.js запускается в потоке, первым шагом является инициализация приложения и выполнение кода верхнего уровня, который, как мы уже говорили ранее, является единственным синхронным кодом, который мы должны иметь в нашем приложении. . Следующий шаг - потребовать модули, которые мы указали в нашем коде (который обычно пишется на самом верху).

Следующим шагом является регистрация всех обратных вызовов событий, которые есть в нашем коде, которые затем будут отправлены в цикл событий для выполнения, где выполняется большая часть нашего кода в приложении узла. Но иногда некоторые задачи слишком тяжелы для выполнения в нашем цикле событий одним потоком, поэтому эти задачи отправляются в пул потоков (предоставляемый Libuv) - это 4 дополнительных потока для выполнения более тяжелых задач без блокировки основного потока. . Количество потоков может быть увеличено, и пользователю не нужно было указывать задачи, которые должны быть выгружены, потому что цикл обработки событий делает все это сам, но мы можем указать количество потоков.

3) Цикл событий: Итак, вы должны помнить об этом, что цикл событий - это место, где выполняется весь наш асинхронный код. На мгновение, почему бы вам не прочитать первый абзац и не прочитать его еще раз, потому что мы рассмотрим третий пункт Node.js, который заключается в том, что он основан на архитектуре, управляемой событиями. Вся идея цикла событий заключается в том, что он работает на этой архитектуре или на этих трех этапах, как показано ниже:

  1. Генерируются события. Эти события могут генерироваться любой асинхронной функцией, такой как получение HTTP-запроса, завершение модулем файловой системы чтения файла или завершение работы таймера. Эти события могут отличаться в нашем коде.
  2. После этого Event-loop их подхватывает.
  3. Функции обратного вызова выполняются (на основе вашего кода).

Помимо этого, цикл событий переносит более тяжелые задачи в пул потоков.

Примечание. Цикл событий следует последовательности для выполнения обратных вызовов.

Обычно цикл событий имеет 4 фазы, и для каждой фазы он устанавливает очередь обратного вызова, которая содержит функции обратного вызова из отправленного события.

  1. Первая фаза - это обратные вызовы с истекшим таймаутом, которые являются функциями обратного вызова из функции setTimeout () и т. Д.
  2. Вторая фаза - это обратные вызовы от опроса ввода-вывода, например, события чтения файла или любого HTTP-запроса.
  3. Третья фаза - это обратные вызовы от функции setImmediate () , которые являются функциями обратного вызова, которые пользователь хочет выполнить сразу после опроса ввода-вывода. Этот тип функций может быть специфическим только для некоторых случаев.
  4. И последнее - обратные вызовы Close, которые генерируются такими событиями, как закрытие веб-сервера и т. Д.

Примечание: сначала выполняются все обратные вызовы, доступные на определенной фазе, и только потом она переходит к следующей фазе. Кроме того, в конце цикла событий он проверяет, продолжается ли какое-либо другое событие, и если это так, возвращается к первой фазе и так далее, в противном случае программа выходит из цикла событий.