Понимание, что такое libuv и как она работает — фундаментальные знания для JavaScript-разработчика, которые, на первый взгляд, могут быть сложными или непонятными, но о них можно рассказать и простыми словами.
Из этой статьи вы узнаете ответы на вопросы:
- Что такое libuv и зачем она нужна?
- Какие преимущества неблокирующего I/O перед блокирующим?
- Как работает libuv?
- Краткая история libuv
Что такое libuv и для чего она нужна
Libuv — это библиотека, которая отвечает за асинхронный ввод/вывод I/Oinput/output–операций в Node.js.
Но одна из главных задач libuv — это сделать Node.js совместимой с большинством оперативных систем (OS) для нормализации неблокирующих операций. Потому что каждая OS имеет свой интерфейс для работы с демультиплексером событий.
Есть такие интерфейсы как kqueue на macOS, epoll на Linux и I/O Copmletion Port API на Windows и другие менее известные, и с ними всеми нужно работать по их правилам, но хорошо, что это крайне эффективно делает libuv .
Какие преимущества неблокирующего I/O перед блокирующим
Если мы используем язык программирования с многопоточностью, например, такой, как Java, то при поступлении запроса на сервер он создает под каждый запрос отдельный поток (thread
), сам процесс создания потока и его обслуживание занимает время, также каждый поток не может обрабатывать несколько соединений, каждая операция I/O в сокете блокирует обработку любого другого соединения.
И таким образом каждый поток забирает память и использует CPU, поэтому количество потоков и время их жизни используют гораздо больше мощностей сервера в тех случаях, где Node.js справляется без проблем (чаты, стриминг видео и т.д.).
Итак, основные преимущества неблокирующего I/O в том, что он быстро принимает запрос, регистрирует его, и сразу принимаются другие запросы, когда кто-то из них будет готов — и только тогда он будет вызван. То есть наш поток не прекращает работу, он не блокируется для каждого запроса. По умолчанию используется один поток в Node.js, но даже с одним потоком Node.js может обрабатывать десятки тысяч простых запросов одновременно.
Как работает libuv
Libuv состоит из таких частей как:
- Демультиплексор событий (
Event Demultiplexor
) - Очереди событий (
Event Queue
) - Цикл событий (
Event Loop
)
Как это работает:
- Первое, что происходит, это приложение отправляет запрос в
Event Demultiplexor
и назначает обработчик (handler
), который будет вызван при завершении операции (operation
). - При завершении набора I/O-операций
Event Demultiplexor
отправляет набор событий вEvent Queue
. - В этой части
Event Loop
проводит итерацию по событиям вEvent Queue
. - Для каждого события вызывается соответствующий обработчик.
- И когда
handler
завершится, то он возвращает управление вEvent Loop
. - Когда уже все события
Event Queue
будут обработаны, тоEvent Loop
блокируется и дает управлениеEvent Demultiplexor
, которое запускает другой цикл для слежки (не поступили ли новые запросы) и уже потом, после того какEvent Demultiplexor
получит новый запрос, тоEvent Loop
будет запущен.
И так все происходит по кругу, если у handler
на этапе выполнения есть другие запросы в базу данных файловой системы, к другим ресурсам и т.д., то он создает новый запрос и все повторяется.
Краткая история libuv
Библиотека прежде всего спроектирована для использования в Node.js, но применяется также в других программных продуктах, таких как Luvit, Julia, uvloop.
Первоначально это была абстракция вокруг libev, поскольку она поддерживала Unix и не поддерживала IOCP в Windows. В libuv-версии node-v0.9.0 libev была удалена.
Спасибо за внимание и продуктивного кодинга 😉
Читайте также: Овладей настоящей силой в Node.js: разбираем микро- и макрозадачи на примерах
Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: