Working with Worker Threads

1. Creating Worker Threads (new Worker)

Example

import { Worker } from "node:worker_threads";
const w = new Worker(new URL("./worker.js", import.meta.url), { workerData: { n: 42 } });
w.on("message", console.log);

2. Passing Data to Workers (workerData)

MechanismUse
workerDataOne-time clone at start
postMessage(data)Ongoing messaging
transferListZero-copy transfer of ArrayBuffer/MessagePort

3. Communicating with postMessage

Example

// main
w.postMessage({ task: "hash", data: buffer }, [buffer.buffer]);
// worker
import { parentPort } from "node:worker_threads";
parentPort.on("message", (m) => parentPort.postMessage(compute(m)));

4. Handling Messages

EventFires
messageData from peer
messageerrorDeserialization failed
onlineWorker started
exitWorker terminated

5. Handling Worker Errors

EventDetail
errorUncaught exception
exit code != 0Crashed

6. Transferring ArrayBuffers

Example: Zero-copy

const buf = new ArrayBuffer(1024 * 1024);
w.postMessage(buf, [buf]); // ownership transferred
console.log(buf.byteLength); // 0 — neutered

7. Sharing Memory (SharedArrayBuffer)

APIUse
new SharedArrayBuffer(n)Memory shared across workers
new Int32Array(sab)Typed view
SynchronizeUse Atomics

8. Using Atomics for Synchronization

MethodUse
Atomics.add / sub / load / storeAtomic ops
Atomics.wait(arr, idx, val)Block until value changes
Atomics.notify(arr, idx, count)Wake waiters
Atomics.compareExchangeCAS

9. Terminating Workers (worker.terminate)

APIReturns
await worker.terminate()Exit code
worker.unref()Don't keep loop alive

10. Using Worker Thread Pools

LibraryUse
piscinaProduction-grade pool
workerpoolSimple API
Roll-your-ownRound-robin send to idle workers

11. Understanding Worker vs Cluster

AspectClusterWorker Threads
MemorySeparate processesSame process, separate isolates
Best forScaling I/O across CPUsCPU-bound tasks within one process
CommunicationIPC + JSONstructuredClone + transferables
Crash isolationStrong (one process per worker)Weaker
Memory costHigher (full V8 per process)Lower (~10–20 MB / worker)