Sobes.tech
Middle+

Как се реализира многопоточността в Node.js?

sobes.tech AI

Отговор от AI

Node.js по своята природа е еднонишков за изпълнение на потребителски JavaScript код. Многозадачността се постига чрез неблокиращ вход/изход и Event Loop. Многопоточността за изпълнение на тежки задачи се реализира с модула worker_threads.

Event Loop:

  • Основен механизъм за асинхронни операции.
  • Еднонишков цикъл, който обработва callback-и, свързани с I/O операции, таймери и други асинхронни събития.

Worker Threads:

  • Позволяват изпълнение на паралелни тежки CPU-bound задачи.
  • Всеки работник стартира своя собствен V8 JavaScript двигател в отделен поток.
  • Общуването между основния поток и работниците става чрез изпращане на съобщения (postMessage, receiveMessage).

Сравнение:

Механизъм Назначение Паралелизъм Изолация на състояния Използване на памет Сложност По-подходящо за
Event Loop Асинхронен I/O Конкурентност Общо състояние Ефективно Ниска I/O-зависими задачи
Worker Threads CPU-зависими изчисления Паралелизъм Изолирано Повече Средна CPU-зависими задачи

Пример за използване на worker_threads:

// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  // Това е основният поток
  const worker = new Worker(__filename); // Създаване на работник с същия файл

  worker.on('message', (msg) => {
    console.log(`Съобщение от работника: ${msg}`);
  });

  worker.on('error', (err) => {
    console.error(err);
  });

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`Работникът приключи с код ${code}`);
  });

  worker.postMessage('Здравей, работник!'); // Изпращане на съобщение към работника

} else {
  // Това е работникът
  parentPort.on('message', (msg) => {
    console.log(`Съобщение от основния поток: ${msg}`);
    parentPort.postMessage('Здравей, основен поток!'); // Изпращане на отговор
  });
}

Event Loop се управлява на ниво Node.js и libuv, докато worker_threads предоставя API за явното създаване и управление на нишки за изпълнение на JavaScript код.