Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Forking Workers Per CPU Core in Node.js
📖 Scenario: You are building a simple Node.js server that can handle many requests efficiently. To do this, you want to use all the CPU cores available on your computer by creating worker processes.
🎯 Goal: Build a Node.js script that uses the cluster module to fork one worker process per CPU core. Each worker will run a simple HTTP server that responds with a greeting message.
📋 What You'll Learn
Create a variable to get the number of CPU cores using os.cpus().length
Use the cluster module to check if the current process is the master
Fork one worker process per CPU core
In each worker, create an HTTP server that listens on port 8000 and responds with 'Hello from worker!'
💡 Why This Matters
🌍 Real World
Using all CPU cores helps Node.js servers handle more requests by running multiple processes in parallel.
💼 Career
Understanding clustering is important for backend developers to build scalable and efficient Node.js applications.
Progress0 / 4 steps
1
Set up required modules and get CPU count
Write code to import the cluster and os modules. Then create a variable called numCPUs that stores the number of CPU cores using os.cpus().length.
Node.js
Hint
Use require('cluster') and require('os') to import modules. Then use os.cpus().length to get CPU count.
2
Check if current process is master
Write an if statement that checks if cluster.isMaster is true. Inside this block, add a comment // Master process code.
Node.js
Hint
Use if (cluster.isMaster) to check if the current process is the master.
3
Fork one worker per CPU core
Inside the if (cluster.isMaster) block, write a for loop that runs from let i = 0 to i < numCPUs. Inside the loop, call cluster.fork() to create a worker.
Node.js
Hint
Use a for loop to fork workers equal to the number of CPU cores.
4
Create HTTP server in each worker
After the if (cluster.isMaster) block, write an else block. Inside it, import the http module, create an HTTP server that listens on port 8000, and responds with 'Hello from worker!'.
Node.js
Hint
Use http.createServer inside the else block to create a server that responds with a message.
Practice
(1/5)
1. What is the main reason to fork workers equal to the number of CPU cores in a Node.js app?
easy
A. To make the app run slower for debugging purposes
B. To use all CPU cores and improve performance by running tasks in parallel
C. To reduce memory usage by limiting the number of processes
D. To avoid using the cluster module
Solution
Step 1: Understand CPU cores and parallelism
Each CPU core can run one process at a time, so using all cores means better performance.
Step 2: Role of forking workers
Forking workers equal to CPU cores lets Node.js run multiple tasks simultaneously, improving speed.
Final Answer:
To use all CPU cores and improve performance by running tasks in parallel -> Option B
Quick Check:
Fork workers = use all cores = better performance [OK]
Hint: More workers = more CPU cores used = faster app [OK]
Common Mistakes:
Thinking forking reduces memory usage
Believing forking slows the app
Confusing cluster module usage
2. Which of the following is the correct way to get the number of CPU cores in Node.js for forking workers?
easy
A. const cores = require('os').cpus().length;
B. const cores = require('cluster').cpuCount;
C. const cores = require('os').cpuCount();
D. const cores = require('os').cpus.length;
Solution
Step 1: Check Node.js os module usage
The os module has a method cpus() that returns an array of CPU core info.
Step 2: Correct syntax to get core count
Using cpus().length gives the number of CPU cores available.
Final Answer:
const cores = require('os').cpus().length; -> Option A
Hint: Use os.cpus().length to count CPU cores [OK]
Common Mistakes:
Forgetting parentheses after cpus
Using non-existent cpuCount method
Trying to get cores from cluster module
3. Given this code snippet, what will be logged when run on a machine with 4 CPU cores?
const cluster = require('cluster');
const os = require('os');
if (cluster.isPrimary) {
const numCPUs = os.cpus().length;
console.log(`Primary process is running`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
console.log(`Worker ${process.pid} started`);
}
medium
A. Primary process is running
Worker 1234 started
Worker 1235 started
Worker 1236 started
Worker 1237 started
B. Primary process is running
Worker started
Worker started
Worker started
Worker started
C. Primary process is running
Worker 1234 started
D. SyntaxError due to missing cluster setup
Solution
Step 1: Identify primary and worker behavior
The primary logs once and forks 4 workers (one per CPU core).
Step 2: Each worker logs its own process id
Each worker logs "Worker [pid] started" with its unique process id.
Final Answer:
Primary process is running
Worker 1234 started
Worker 1235 started
Worker 1236 started
Worker 1237 started -> Option A
Quick Check:
Primary logs once, 4 workers log with pids [OK]
Hint: Primary logs once; each worker logs with unique pid [OK]
Common Mistakes:
Assuming workers log without pid
Thinking only one worker starts
Confusing primary and worker logs
4. What is wrong with this code snippet that tries to fork workers per CPU core?
const cluster = require('cluster');
const os = require('os');
if (cluster.isPrimary) {
const numCPUs = os.cpus.length;
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
console.log('Worker started');
}
medium
A. cluster.fork() is not a function
B. No error; code works fine
C. Missing else block for worker process
D. os.cpus.length is undefined; should be os.cpus().length
Solution
Step 1: Check os module usage
os.cpus is a function, so os.cpus.length is undefined and causes error.
Step 2: Correct usage
Use os.cpus().length to get the number of CPU cores correctly.
Final Answer:
os.cpus.length is undefined; should be os.cpus().length -> Option D
Quick Check:
os.cpus() is function, need parentheses [OK]
Hint: Remember os.cpus() is a function, not a property [OK]
Common Mistakes:
Forgetting parentheses on os.cpus()
Assuming cluster.fork() is missing
Thinking else block is required for syntax
5. You want to create a Node.js server that forks one worker per CPU core and restarts any worker if it crashes. Which code snippet correctly implements this behavior?
hard
A. const cluster = require('cluster');
const http = require('http');
const os = require('os');
if (cluster.isPrimary) {
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello from worker ' + process.pid);
}).listen(8000);
cluster.on('exit', (worker) => {
console.log(`Worker ${worker.process.pid} died`);
});
}
B. const cluster = require('cluster');
const http = require('http');
const os = require('os');
if (cluster.isWorker) {
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello from worker ' + process.pid);
}).listen(8000);
}
C. const cluster = require('cluster');
const http = require('http');
const os = require('os');
if (cluster.isPrimary) {
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker) => {
console.log(`Worker ${worker.process.pid} died, restarting...`);
cluster.fork();
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello from worker ' + process.pid);
}).listen(8000);
}
D. const cluster = require('cluster');
const http = require('http');
const os = require('os');
if (cluster.isPrimary) {
cluster.fork();
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello from worker ' + process.pid);
}).listen(8000);
}
Solution
Step 1: Fork one worker per CPU core in primary process
In if (cluster.isPrimary), use const numCPUs = os.cpus().length; for (let i = 0; i < numCPUs; i++) cluster.fork();