আগের Event Loop পাঠ ব্যাখ্যা করেছে কেন Node একটা একক thread-এ অনেক request handle করে — এটা ভালো কাজ করে কারণ বেশিরভাগ server কাজ compute না, অপেক্ষা (একটা file, একটা database, একটা network response-এর জন্য)। এই তিনটা tool সেই case কভার করে যেখানে সেই একক thread সত্যিকারভাবে যথেষ্ট না।
একটা আলাদা operating-system process চালায় — একই thread-এ আরো JavaScript না, সম্পূর্ণ অন্য একটা program।
import { exec } from 'child_process'
exec('ls -la', (err, stdout, stderr) => {
if (err) throw err
console.log(stdout)
})child_process-এর মতো না, একটা worker thread মূল thread থেকে আলাদা একটা আসল OS thread-এ আরো JavaScript চালায় — CPU-intensive কাজের জন্য (ভারী computation, image processing, বড় data transformation) যা নাহলে সবার জন্য event loop block করত।
// worker.js
import { parentPort, workerData } from 'worker_threads'
function heavyComputation(n) {
let result = 0
for (let i = 0; i < n; i++) result += i
return result
}
parentPort.postMessage(heavyComputation(workerData))// main.js
import { Worker } from 'worker_threads'
const worker = new Worker('./worker.js', { workerData: 1_000_000_000 })
worker.on('message', (result) => {
console.log('Result:', result)
})
// এটা চলার সময় main thread — আর অন্য request handle করার server-এর
// ক্ষমতা — responsive থাকেworker_threads আসলে যা আটকায়
ভারী synchronous computation সরাসরি main thread-এ (একটা worker-এর বদলে) চালানো server যে প্রতিটা request handle করছে তা block করে — "Node single-threaded" warning আসলে এই failure mode নিয়ে।
একটা একক Node process কখনো শুধু একটা CPU core ব্যবহার করে। cluster পুরো application-এর একাধিক কপি fork করে — প্রতি core-এ একটা — একটা built-in load balancer সহ যা আসা request এদের মধ্যে ভাগ করে।
import cluster from 'cluster'
import os from 'os'
if (cluster.isPrimary) {
const cpuCount = os.cpus().length
for (let i = 0; i < cpuCount; i++) {
cluster.fork()
}
} else {
// এই কোড প্রতিটা worker process-এ চলে — আসল server
startServer()
}| Tool | যা চালায় | যার জন্য ব্যবহার |
|---|---|---|
| child_process | একটা আলাদা OS process, যেকোনো program | একটা shell command বা external tool চালানো |
| worker_threads | আরো JavaScript, একটা আলাদা OS thread | event loop block করত এমন CPU-ভারী computation |
| cluster | পুরো app-এর একাধিক কপি, প্রতি CPU core-এ একটা | বেশি throughput-এর জন্য একটা multi-core server-এর প্রতিটা core ব্যবহার |
বেশিরভাগ আসল project আসলে যা ব্যবহার করে
PM2-এর মতো tool (এই সাইটের Hosting & Deployment কোর্সে কভার করা) স্বয়ংক্রিয়ভাবে clustering আর process restart manage করে — বাস্তবে একটা tool এটা handle করলেও, underlying cluster module conceptually জানার যোগ্য।