Sobes.tech
Middle+

Jak realizowana jest wielowątkowość w Node.js?

sobes.tech AI

Odpowiedź od AI

Node.js jest z natury jednowątkowy, aby wykonywać kod JavaScript użytkownika. Wielozadaniowość osiąga się dzięki nieblokującemu wejściu/wyjściu i pętli zdarzeń (Event Loop). Wielowątkowość do wykonywania ciężkich zadań jest realizowana za pomocą modułu worker_threads.

Event Loop:

  • Główny mechanizm dla operacji asynchronicznych.
  • Jednowątkowa pętla, która obsługuje callbacki związane z operacjami I/O, timerami i innymi zdarzeniami asynchronicznymi.

Worker Threads:

  • Pozwalają na równoległe wykonywanie ciężkich zadań CPU-bound.
  • Każdy worker uruchamia własny silnik V8 JavaScript w osobnym wątku.
  • Komunikacja między głównym wątkiem a workerami odbywa się przez przesyłanie wiadomości (postMessage, receiveMessage).

Porównanie:

Mechanizm Cel Równoległość Izolacja stanów Użycie pamięci Złożoność Lepsze dla
Event Loop Asynchroniczne I/O Konkurencja Wspólny stan Efektywne Niska Zadania I/O-bound
Worker Threads Obliczenia CPU-bound Równoległość Izolacja Wyższa Zadania CPU-bound

Przykład użycia worker_threads:

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

if (isMainThread) {
  // To jest główny wątek
  const worker = new Worker(__filename); // Tworzymy worker używając tego samego pliku

  worker.on('message', (msg) => {
    console.log(`Wiadomość od workera: ${msg}`);
  });

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

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`Worker zakończył się z kodem ${code}`);
  });

  worker.postMessage('Cześć, worker!'); // Wysyłamy wiadomość do workera

} else {
  // To jest wątek workera
  parentPort.on('message', (msg) => {
    console.log(`Wiadomość od głównego wątku: ${msg}`);
    parentPort.postMessage('Cześć, główny wątek!'); // Wysyłamy odpowiedź
  });
}

Event Loop jest zarządzany na poziomie Node.js i libuv, podczas gdy worker_threads zapewnia API do jawnego tworzenia i zarządzania wątkami do wykonywania kodu JavaScript.