typescriptadvanced

Node.js Worker Threads for Parallel Processing

Use Worker Threads to run CPU-intensive tasks in parallel without blocking the event loop.

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

if (isMainThread) {
  // Main thread: distribute work across workers
  async function processInParallel<T, R>(
    items: T[],
    workerFile: string
  ): Promise<R[]> {
    const numWorkers = Math.min(cpus().length, items.length);
    const chunkSize = Math.ceil(items.length / numWorkers);

    const promises = Array.from({ length: numWorkers }, (_, i) => {
      const chunk = items.slice(i * chunkSize, (i + 1) * chunkSize);
      return new Promise<R[]>((resolve, reject) => {
        const worker = new Worker(workerFile, { workerData: chunk });
        worker.on('message', resolve);
        worker.on('error', reject);
      });
    });

    const results = await Promise.all(promises);
    return results.flat();
  }

  // Usage
  const data = Array.from({ length: 1000 }, (_, i) => i);
  const results = await processInParallel(data, new URL(import.meta.url).pathname);
  console.log(`Processed ${results.length} items`);
} else {
  // Worker thread: process assigned chunk
  const chunk = workerData as number[];
  const results = chunk.map((n) => {
    // CPU-intensive work
    let sum = 0;
    for (let i = 0; i < 1_000_000; i++) sum += Math.sqrt(n + i);
    return { input: n, result: sum };
  });
  parentPort?.postMessage(results);
}

Use Cases

  • CPU-intensive data processing without blocking
  • Parallel image or file processing
  • Splitting heavy computation across CPU cores

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.