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 и переиспользование.
- Крупнозернистые сообщения.