Розуміння що таке libuv і як вона працює — є фундаментальними знаннями для JavaScript-розробника, які на перший погляд можуть бути складними або незрозумілими, але про них можливо розповісти і простими словами.
Із цієї статті ви дізнаєтеся відповіді на запитання:
Libuv — це бібліотека, яка відповідає за асинхронне введення/виведення I/O
Але одна з головних задач libuv — це зробити Node.js сумісною з більшістью оперативних систем (OS) для нормалізації не блокуючих операцій. Тому що кожна OS має власний інтерфейс для роботи з демультиплексером подій.
Є такі інтерфейси як kqueue на macOS, epoll на Linux та I/O Copmletion Port API на Windows та інші менш відомі, і з ними всіма треба працювати за їхніми правилами, але добре що це крайнє ефективно робить libuv.
Якщо ми використовуємо мову програмування з многопоточністю, наприклад, таку, як Java, то при надходжені запита на сервер вона створює під кожен запит окремий потік (thread
), сам процес створення потоку та їхнє обслуговування займає час, також кожен потік не може обробляти декілька з’єднань, кожна операція I/O в сокет блокує обробку будь-якого іншого з’єднання.
І таким чином кожен потік забирає пам’ять та використовує CPU, тож кількість потоків та час їхнього життя використовують набагато більше потужностей сервера в тих випадках, де Node.js дає раду без проблем (чати, стрімінг відео тощо).
Тож основні переваги не блокуючого I/O в тому, що він швидко приймає запит, реєструє його і одразу приймаються інші запити, коли хтось з них буде готовий — і тільки тоді він буде викликаний. Тобто наш потік не припиняє роботу, він не блокується для кожного запиту. За замовчуванням використовується один потік в Node.js, але навіть і з одним потоком Node.js може обробляти десятки тисяч простих запитів одночасно.
Libuv складається з таких частин як:
Event Demultiplexor
)Event Queue
)Event Loop
)Як це працює:
Event Demultiplexor
та назначає обробник (handler
), який буде визвано при завершені операції (operation
).Event Demultiplexor
відправляє набір подій до Event Queue
.Event Loop
проводить ітерацію по подіям в Event Queue
.handler
завершиться, то він повертає управління до Event Loop
.Event Queue
будуть оброблені, то Event Loop
блокується і дає управління Event Demultiplexor
, який запускає інший цикл для стеження (чи не надійшли нові запити) і вже потім, після того як Event Demultiplexor
отримає новий запит, то Event Loop
буде запущений.І так все відбувається по колу, якщо handler
на етапі виконання має інші запити в базу даних файлової системи, до інших ресурсів тощо, то він створює новий запит і все повторюється.
Бібліотека передусім спроєктована для використання в Node.js, але застосовується також в інших програмних продуктах таких як Luvit, Julia, uvloop.
Спочатку це була абстракція навколо libev, оскільки вона підтримувала Unix і не підтримувала IOCP у Windows. У libuv-версії node-v0.9.0 libev була вилучена.
Дякую вам за увагу і продуктивного кодування 😉
Читайте також: Опануй справжню силу в Node.js: розбираємо мікро- та макрозадачі на прикладах
Днями я завзято нила про щось ChatGPT (експериментую між сеансами з живим терапевтом). І от…
«Крутіть колесо, щоб отримати знижку до 50%!» «Натисніть тут, щоб відкрити таємничу пропозицію!» «Зареєструйтесь зараз,…
Дуже хочеться робити якісь десктопні апки. Сумую за часами коли всі програми були offline-first, і…
Надсилаючи криптовалюту, багато новачків ставлять запитання: як працюють комісії та чому вони відрізняються в різних…
Нова афера набирає обертів — ось детальний розбір того, як фальшиві потенційні роботодавці намагаються вкрасти…
Соцмережа з можливістю вбудовувати повноцінні додатки прямо в пости — звучить як фантастика, але Farcaster…