advanced

Worker threads

Переносите CPU-heavy work в worker threads с message passing, transfer lists, shared memory и lifecycle control.

Worker threads выполняют JavaScript в отдельных изолятах V8 с обменом через сообщения — инструмент для CPU-bound JS, не замена cluster-масштабированию.

					import { Worker, isMainThread, parentPort, workerData } from 'node:worker_threads';

if (isMainThread) {
  const worker = new Worker(new URL(import.meta.url), {
    workerData: { primesUpTo: 500_000 },
  });
  worker.on('message', (result) => console.log(result));
} else {
  const count = countPrimes(workerData.primesUpTo);
  parentPort.postMessage({ count });
}
				

Transfer list передаёт владение ArrayBuffer без копирования. `SharedArrayBuffer` — общая память, но нужна синхронизация.

Старт worker дорог, память отдельная — батчьте работу в сообщении, не делайте мелкий RPC.

На интервью: workers (потоки, один процесс) vs cluster (процессы) vs child process; когда workers лучше async I/O.

Типовые ошибки: большие объекты без transfer list; общее mutable-состояние без Atomics; worker на каждый запрос под нагрузкой.

Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.

Чеклист:

  • Workers для тяжёлого чистого JS.
  • Передавайте ArrayBuffer через transfer.
  • Пул workers и переиспользование.
  • Крупнозернистые сообщения.