Цели

Узнайте, как работает цикл событий в Node.js.

Основы

Что такое Node.js?

Node.js — это среда выполнения JavaScript, созданная на движке Chrome V8. Он выполняет код JavaScript вне браузера. Он использует управляемую событиями неблокирующую модель ввода-вывода, что делает его легким и эффективным.

JavaScript

JavaScript — это синхронный, блокирующий, однопоточный язык.

Синхронная природа

В приведенном ниже коде регистрируется first function, затем регистрируется second function. Это связано с тем, что JavaScript является синхронным. Он выполняет код построчно. Что, если первая функция является долговременной функцией? Второй функции придется подождать, пока не выполнится первая функция. Это называется блокировкой. Вторая функция заблокирована первой функцией 😔. Это не идеальный вариант, поскольку делает программу медленной и не отвечающей на запросы.

Среда выполнения Node.js

Здесь на помощь приходит Node.js. Node.js является асинхронным и неблокирующим. Он использует один поток для обработки нескольких запросов. Он предоставляет нам несколько API, которые позволяют нам выполнять асинхронные вызовы.

Давайте посмотрим на высокоуровневую архитектуру Node.js. Это изображение из этой удивительной статьи. Я настоятельно рекомендую вам прочитать это.

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

  • Библиотека JavaScript, предоставляющая функции и утилиты для использования возможностей C++ из вашего кода JavaScript.
  • Функции C++, обеспечивающие такие функции, как доступ к файловой системе и работе в сети.
  • Внешние зависимости, такие как V8, libuv, crypto, необходимые Node.js для его функционирования.

Хотя все части важны, ключевым компонентом асинхронного программирования в Node.js является внешняя зависимость libuv.

Что такое libuv?

Libuv – это многоплатформенная библиотека C, обеспечивающая поддержку асинхронного ввода-вывода на основе циклов событий. В среде выполнения Node.js его роль заключается в обеспечении поддержки обработки асинхронных операций. Чтобы глубже погрузиться в libuv, эта статья — отличное начало. Короче говоря, Libuv помогает nodejs выполнять эти операции асинхронно и повышать эффективность и производительность, в то время как основной поток обрабатывает операцию, а другие исполнители выполняют задачу. Libuv помогает nodejs обеспечить плавную асинхронную работу.

Что такое цикл событий?

Когда Node.js запускается, он инициализирует цикл событий, обрабатывает предоставленный входной скрипт, который может выполнять асинхронные вызовы API, планировать таймеры или вызывать процесс.nextTick(), а затем начинает обработку цикла событий.

На следующей диаграмме показан упрощенный обзор порядка операций цикла событий.

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

В бою

Давайте посмотрим на код ниже. Это типичный асинхронный код.

Давайте разберем это шаг за шагом.

  1. Выполняется первый оператор журнала консоли, и в консоли регистрируется «Привет от первой функции». Затем эта задача завершается и извлекается из стека вызовов.
  2. Встречается функция setTimeout, и ее функция обратного вызова запланирована на запуск после указанной задержки (в данном случае 1000 мс). Задача setTimeout помещается в очередь, и функция переходит к следующей задаче.
  3. Выполняется третий оператор журнала консоли, и в консоли регистрируется «Привет от третьей функции». Эта задача завершена и извлечена из стека вызовов.
  4. Тем временем цикл событий постоянно проверяет, пуст ли стек вызовов. Когда таймер, установленный функцией setTimeout, истекает (т. е. через 1000 мс), функция обратного вызова для задачи setTimeout отправляется в задачу очередь событий.
  5. Цикл событий определяет, что стек вызовов пуст, и извлекает следующую задачу из очереди событий, которая является функцией обратного вызова для setTimeout.
  6. Затем функция обратного вызова помещается в стек вызовов и выполняется. «Привет от второй функции» регистрируется в консоли, и эта задача впоследствии извлекается из стека вызовов.

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

Заключение

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

Ознакомьтесь со всеми сообщениями в моем блоге



Ресурсы

На простом английском языке

Спасибо, что вы являетесь частью нашего сообщества! Прежде чем уйти: