Bird
Raised Fist0
Node.jsframework~10 mins

Forking workers per CPU core in Node.js - Interactive Code Practice

Choose your learning style10 modes available

Start learning this pattern below

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
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to import the cluster module.

Node.js
const cluster = require('[1]');
Drag options to blanks, or click blank then click option'
Ahttp
Bcluster
Cos
Dfs
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'os' instead of 'cluster' to import the cluster module.
Forgetting to import the cluster module.
2fill in blank
medium

Complete the code to import the OS module.

Node.js
const os = require('[1]');
Drag options to blanks, or click blank then click option'
Aos
Bcluster
Chttp
Dpath
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'cluster' instead of 'os' to import the OS module.
Confusing 'os' with 'http' or 'path'.
3fill in blank
hard

Fix the error in the code to get the number of CPU cores.

Node.js
const numCPUs = os.[1]();
Drag options to blanks, or click blank then click option'
AcpuCount
Bcores
CcpuCores
Dcpus
Attempts:
3 left
💡 Hint
Common Mistakes
Using a non-existent method like 'cpuCount' or 'cores'.
Forgetting the parentheses after the method name.
4fill in blank
hard

Fill both blanks to fork a worker for each CPU core.

Node.js
if (cluster.[1]) {
  for (let i = 0; i < numCPUs.[2]; i++) {
    cluster.fork();
  }
}
Drag options to blanks, or click blank then click option'
AisPrimary
Blength
CisMaster
Dcount
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'isMaster' instead of 'isPrimary'.
Using 'count' or 'size' instead of 'length' for array length.
5fill in blank
hard

Fill all three blanks to log when a worker exits and fork a new one.

Node.js
cluster.on('[1]', (worker, code, signal) => {
  console.log(`Worker ${worker.[2] died`);
  cluster.[3]();
});
Drag options to blanks, or click blank then click option'
Aexit
Bpid
Cfork
Did
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'disconnect' or 'close' instead of 'exit' event.
Using 'id' or 'workerId' instead of 'pid' for worker identifier.
Using 'spawn' or 'create' instead of 'fork' to start a new worker.

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

  1. Step 1: Understand CPU cores and parallelism

    Each CPU core can run one process at a time, so using all cores means better performance.
  2. Step 2: Role of forking workers

    Forking workers equal to CPU cores lets Node.js run multiple tasks simultaneously, improving speed.
  3. Final Answer:

    To use all CPU cores and improve performance by running tasks in parallel -> Option B
  4. 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

  1. Step 1: Check Node.js os module usage

    The os module has a method cpus() that returns an array of CPU core info.
  2. Step 2: Correct syntax to get core count

    Using cpus().length gives the number of CPU cores available.
  3. Final Answer:

    const cores = require('os').cpus().length; -> Option A
  4. Quick Check:

    os.cpus() returns array, length gives core count [OK]
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

  1. Step 1: Identify primary and worker behavior

    The primary logs once and forks 4 workers (one per CPU core).
  2. Step 2: Each worker logs its own process id

    Each worker logs "Worker [pid] started" with its unique process id.
  3. Final Answer:

    Primary process is running Worker 1234 started Worker 1235 started Worker 1236 started Worker 1237 started -> Option A
  4. 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

  1. Step 1: Check os module usage

    os.cpus is a function, so os.cpus.length is undefined and causes error.
  2. Step 2: Correct usage

    Use os.cpus().length to get the number of CPU cores correctly.
  3. Final Answer:

    os.cpus.length is undefined; should be os.cpus().length -> Option D
  4. 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

  1. 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();
  2. Step 2: Restart workers on exit event

    In primary process, cluster.on('exit', (worker) => { console.log(`Worker ${worker.process.pid} died, restarting...`); cluster.fork(); });
  3. Step 3: Worker creates HTTP server

    Workers create the HTTP server listening on port 8000, responding with their pid.
  4. Final Answer:

    forks one worker per CPU core and restarts any worker if it crashes -> Option C
  5. Quick Check:

    Primary forks os.cpus().length + cluster.on('exit', fork()) + workers create HTTP server [OK]
Hint: Use cluster.on('exit') in primary to restart workers [OK]
Common Mistakes:
  • Using cluster.isWorker instead of cluster.isPrimary
  • Not restarting workers on exit
  • Forking workers inside worker process