Home  Nodejs   Difference ...

Difference between fork, cluster and worker_threads in Node.js

In Node.js, fork, cluster, and worker_threads are mechanisms used for concurrent and parallel processing, each serving specific purposes and scenarios. Here's a breakdown of how they differ and when each is typically used:

1. fork (Child Processes)

Purpose: Forking a process allows you to create child processes in Node.js, which are separate instances of the Node.js runtime. This is often used for executing separate Node.js scripts or modules in parallel.

Typical Use Case: Running multiple instances of a script concurrently, leveraging multiple CPU cores, or isolating tasks that might otherwise block the main event loop.

Example:

const { fork } = require('child_process');

const childProcess = fork('./child.js');

childProcess.on('message', (msg) => {
  console.log('Message from child:', msg);
});

childProcess.send('Hello from parent');

2. cluster (Built-in Module)

Purpose: The cluster module allows you to spawn multiple Node.js worker processes that share the same server port. It's designed to take advantage of multi-core systems by balancing the load across CPU cores.

Typical Use Case: Creating a cluster of Node.js processes to handle incoming HTTP requests in a load-balanced manner.

Example:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master process ${process.pid} is running`);

  // Fork workers
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died`);
  });
} else {
  // Worker process
  console.log(`Worker process ${process.pid} started`);

  // Create an HTTP server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello, World!');
  }).listen(8000);
}

3. worker_threads (Experimental Worker Threads)

Purpose: worker_threads module introduces true threading support in Node.js, allowing you to run JavaScript in parallel threads. Each worker thread operates in its own isolated context but can share memory with other threads through SharedArrayBuffer.

Typical Use Case: CPU-intensive tasks that can benefit from multi-threading without the overhead of spawning multiple processes.

Example:

const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  console.log(`Main thread ${process.pid} is running`);

  // Create a worker thread
  const worker = new Worker('./worker.js');

  // Handle messages from the worker thread
  worker.on('message', (msg) => {
    console.log('Message from worker:', msg);
  });

  // Send a message to the worker thread
  worker.postMessage('Hello from main thread');
} else {
  // Worker thread
  console.log(`Worker thread ${process.pid} started`);

  // Listen for messages from the main thread
  parentPort.on('message', (msg) => {
    console.log('Message from main thread:', msg);

    // Send a message back to the main thread
    parentPort.postMessage('Hello from worker thread');
  });
}

Differences and Considerations

Published on: Jun 19, 2024, 03:22 AM  
 

Comments

Add your comment