Using Worker Threads in Node.js for CPU-Bound Tasks
Introduction
Offloading heavy computations to worker threads prevents blocking the event loop and improves Node.js application responsiveness.
Prerequisites
- Node.js >=12
Step 1: Create Worker File
Create worker.js
:
const { parentPort } = require("worker_threads");
// Listen for messages from the parent thread
parentPort.on("message", data => {
// Perform CPU-intensive task
let result = 0;
for (let i = 0; i < data.iterations; i++) {
result += Math.sqrt(i);
}
parentPort.postMessage({ result });
});
Step 2: Main Thread Implementation
Create main.js
:
const { Worker } = require("worker_threads");
function runService(iterations) {
return new Promise((resolve, reject) => {
const worker = new Worker("./worker.js");
worker.postMessage({ iterations });
worker.on("message", resolve);
worker.on("error", reject);
worker.on("exit", code => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
});
});
}
(async () => {
const { result } = await runService(1e7);
console.log(`Result: ${result}`);
})();
Step 3: Run the Service
node main.js
Summary
Worker threads enable parallel CPU-bound processing, enhancing throughput and keeping the event loop responsive.