Станьте архітектором Enterprise-систем з практичним курсом 🚀 Знижка 30% на пакет Platinum 🔥
Дізнатися більше
08.11.2024
3 хвилин читання

Основи багатопоточності в Node.js: як використовувати й оптимізувати

Незважаючи на те, що Node.js від початку працює за однопотоковою моделлю, віднедавна з’явилися можливості для реалізації багатопотоковості. У цій статті ми розберемо як оптимізувати багатопотокові процеси і роль node.js event loop. Більше практичної інформації ви отримаєте на курсах програмування FoxmindEd.

FoxmindEd запрошує розробників-початківців освоїти Node.js на курсах менторингу! Менторинг у нас – формат, що базується повністю на практичних завданнях і підтримці досвідчених менторів.
Деталі курсу

Що таке багатопоточність і як вона працює

Багатопоточність – це здатність програми виконувати кілька завдань паралельно. У традиційних мовах програмування це досягається створенням кількох потоків (тредів) виконання всередині одного процесу. Однак, багатопоточність Node.js реалізовано дещо інакше.

На перший погляд це обмеження, але Node.js використовує потужний механізм асинхронного виконання завдань. У разі необхідності виконання паралельних операцій, наприклад, під час обробки даних, використовуються спеціальні Worker Threads, які дають змогу розширити функціональність платформи та підвищити продуктивність.

Роль Event Loop 

Серце Node.js – це його Event Loop. Цей цикл управління подіями дає змогу платформі обробляти безліч запитів одночасно, не створюючи додаткові потоки. Як це працює? Коли надходить запит на виконання завдання, Event Loop передає його в чергу і виконує асинхронні операції в міру їхньої готовності. Це і допомагає Node.js обробляти безліч підключень без необхідності створення нових тредів.

Як працює модель однопотокового виконання

Однопотокова модель Node.js була спроектована таким чином, щоб максимально ефективно використовувати ресурси під час роботи з I/O операціями (введенням-виведенням). Усі завдання, які вимагають довгого очікування (наприклад, читання файлів, мережеві запити), виконуються асинхронно, що звільняє основний потік для інших завдань. Як результат – висока продуктивність навіть без використання багатопоточності у звичному розумінні.

Використання потоків

Хоча платформа спочатку була розроблена як однопотокова, розробники додали інструменти для роботи з Node.js потоками. Ці інструменти надають можливості для роботи з багатопотоковими операціями, особливо за необхідності виконання важких обчислень.

Node.js потоки даних – це інтерфейси, які допомагають ефективно передавати дані між частинами програми. Потоки можуть бути як для читання, так і для запису. Їхня ключова перевага – можливість працювати з великими обсягами даних, не завантажуючи пам’ять.

Як створювати та керувати потоками

Створення потоків у Node.js здійснюється через модуль stream. Процеси ці можуть бути декількох типів: читання, запис, дуплексні (двонаправлені), а також потоки для перетворення даних. Приклад створення потоку читання має такий вигляд:

const fs = require('fs');

const readableStream = fs.createReadStream('file.txt');

readableStream.on('data', (chunk) => {

  console.log(`Received ${chunk.length} bytes of data.`);

});

Багатопотокові операції та їх реалізація

Багатопотокові завдання в Node.js вимагають використання Worker Threads – модуля, який було введено в це середовище починаючи з версії 10.5.0. Ці потоки дають змогу виконувати ресурсомісткі завдання паралельно з основним.

Розглянемо приклад створення простого треду за допомогою модуля worker_threads:

const { Worker } = require('worker_threads');

const worker = new Worker('./worker.js');

worker.on('message', (message) => {

  console.log(`Received message: ${message}`);

});

Крім цього, використання Worker Threads у реальних додатках охоплює завдання, як-от паралельне опрацювання великих обсягів даних, стиснення файлів, виконання складних обчислень і багато іншого.

Оптимізація продуктивності під час використання потоків

Для кращої продуктивності потрібно грамотно розподіляти завдання між основним потоком і Worker Threads. Часте створення нових процесів може уповільнити програму. Тому оптимальний варіант – використовувати пул тредів, які виконуватимуть завдання в міру їх надходження. При цьому важливо враховувати, що вони повинні синхронізувати дані, щоб уникнути затримок і помилок.

Підпишіться на наш Ютуб-канал! Корисні відео для програмістів чекають на вас! YouTube
Оберіть свій курс програмування! Шлях до кар’єри програміста починається тут! Подивитись

Практичні приклади та кейси багатопоточності

Асинхронна обробка даних у Node.js дає змогу виконувати завдання без блокування основного потоку. Наприклад, під час виконання кількох запитів до бази даних, можна запустити їх паралельно за допомогою Promise.all, що прискорить час відгуку:

const fetchData = async () => {

  const [data1, data2] = await Promise.all([dbQuery1(), dbQuery2()]);

  console.log(data1, data2);

};

Паралельне опрацювання з використанням Worker Threads у Node.js допомагає впоратися із завданнями, що вимагають великих обчислювальних ресурсів. Наприклад, під час розрахунку кількох складних математичних операцій:

const { Worker } = require('worker_threads');

const worker = new Worker('./calculate.js');

worker.on('message', (result) => {

  console.log(`Calculation result: ${result}`);

});

А ось для опрацювання великих файлів, таких як логи або відео, можна розділити файл на частини і обробити їх паралельно через Worker Threads. Це дає змогу прискорити процес завдяки одночасній роботі кількох тредів:

const { Worker } = require('worker_threads');

const fileChunks = splitFile('bigfile.txt'); 

fileChunks.forEach(chunk => {

  const worker = new Worker('./processChunk.js', { workerData: chunk });

});

Висновок

Таким чином, багатопоточність Node.js – це потужний інструмент, який дає можливість оптимізувати роботу застосунків завдяки виконанню ресурсномістких завдань у паралельних потоках.

FAQ
Що таке багатопоточність у Node.js?

Багатопоточність - це виконання кількох завдань одночасно, реалізується в Node.js через Worker Threads.

Як працює Event Loop у Node.js?

Event Loop керує асинхронними завданнями, даючи змогу обробляти кілька запитів без створення нових потоків.

Для чого потрібна однопотокова модель?

Однопотокова модель у Node.js оптимізує роботу з I/O операціями, звільняючи ресурси для інших завдань.

Чи можна використовувати потоки для складних обчислень?

Так, за допомогою Worker Threads можна виконувати ресурсомісткі операції паралельно з основним процесом.

Які типи потоків існують у Node.js?

У Node.js доступні потоки для читання, запису, дуплексні (двонаправлені) і для перетворення даних.

Як оптимізувати продуктивність із потоками?

Використовуйте пул тредів для виконання завдань у міру надходження, уникаючи частого створення нових процесів.

🚀 Готові дізнатися більше про багатопоточність у Node.js? Ставте запитання або діліться коментарями!

Додати коментар

Ваш імейл не буде опубліковано. Обов'язкові поля відзначені *

Зберегти моє ім'я, імейл та адресу сайту у цьому браузері для майбутніх коментарів