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.