Sobes.tech
Middle+

Jak je implementována vícenásobnost v Node.js?

sobes.tech AI

Odpověď od AI

Node.js je přirozeně jednovláknové prostředí pro spouštění uživatelského JavaScriptového kódu. Víceúlohovost je dosažena pomocí neblokujícího vstupu/výstupu a Event Loop. Vícevláknové zpracování těžkých úloh je realizováno pomocí modulu worker_threads.

Event Loop:

  • Hlavní mechanismus pro asynchronní operace.
  • Jednovlákní cyklus, který zpracovává callbacky související s I/O operacemi, časovači a dalšími asynchronními událostmi.

Worker Threads:

  • Umožňují paralelní vykonávání těžkých CPU-bound úloh.
  • Každý worker spouští svůj vlastní V8 JavaScript engine v samostatném vlákně.
  • Komunikace mezi hlavním vláknem a workery probíhá prostřednictvím posílání zpráv (postMessage, receiveMessage).

Porovnání:

Mechanismus Účel Paralelismus Izolace stavů Použití paměti Složitost Vhodné pro
Event Loop Asynchronní I/O Konkurenční Sdílený stav Efektivní Nízká I/O-vázané úlohy
Worker Threads CPU-vázané výpočty Paralelní Izolované Vyšší Střední CPU-vázané úlohy

Příklad použití worker_threads:

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

if (isMainThread) {
  // Hlavní vlákno
  const worker = new Worker(__filename); // Vytvoření workeru se stejným souborem

  worker.on('message', (msg) => {
    console.log(`Zpráva od workeru: ${msg}`);
  });

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

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`Worker skončil s kódem ${code}`);
  });

  worker.postMessage('Ahoj, worker!'); // Odeslání zprávy workeru

} else {
  // Worker thread
  parentPort.on('message', (msg) => {
    console.log(`Zpráva od hlavního vlákna: ${msg}`);
    parentPort.postMessage('Ahoj, hlavní vlákno!'); // Odeslání odpovědi
  });
}

Event Loop je řízen na úrovni Node.js a libuv, zatímco worker_threads poskytují API pro explicitní vytváření a správu vláken pro vykonávání JavaScriptového kódu.