परिचय: जावास्क्रिप्ट में मल्टीथ्रेडिंग के मिथक और वास्तविकता
जावास्क्रिप्ट पारंपरिक रूप से एकल-थ्रेडेड निष्पादन मॉडल से जुड़ा हुआ है। कई डेवलपर्स, विशेष रूप से C++ या Java की दुनिया से आने वाले, इसे एक सीमा मानते हैं। हालाँकि, आधुनिक Node.js इकोसिस्टम समवर्तीता और, इससे भी महत्वपूर्ण बात, वास्तविक मल्टीथ्रेडिंग के साथ काम करने के लिए शक्तिशाली उपकरण प्रदान करता है। इस लेख में, हम समझेंगे कि Event Loop कैसे काम करता है, Worker Threads का उपयोग कब करना है, और उच्च-लोड अनुप्रयोगों का सही तरीके से निर्माण कैसे करना है।
शास्त्रीय मल्टीथ्रेडिंग के विपरीत, जहां प्रत्येक थ्रेड का अपना स्टैक होता है और वह प्रोसेसर के विभिन्न कोर पर समानांतर रूप से निष्पादित हो सकता है, ब्राउज़र और Node.js में जावास्क्रिप्ट ईवेंट-आधारित समवर्तीता मॉडल का उपयोग करता है। हालाँकि, Node.js में worker_threads मॉड्यूल के आगमन के साथ, हमें वास्तविक समानांतरता की संभावना मिल गई है।
मुख्य भाग
1. Event Loop: Node.js में समवर्तीता का हृदय
Event Loop एक तंत्र है जो Node.js को जावास्क्रिप्ट की एकल-थ्रेडेड प्रकृति के बावजूद, नॉन-ब्लॉकिंग इनपुट/आउटपुट (I/O) संचालन करने की अनुमति देता है। यह लगातार कार्यों की कतार की जाँच करता है और उन्हें आने पर निष्पादित करता है।
Event Loop के मुख्य चरण:
- Timers —
setTimeout()औरsetInterval()के माध्यम से निर्धारित कॉलबैक का निष्पादन। - I/O callbacks — पूर्ण I/O संचालन की प्रोसेसिंग।
- Idle, prepare — Node.js के आंतरिक चरण।
- Poll — नई I/O घटनाओं को प्राप्त करना और उनके कॉलबैक को निष्पादित करना।
- Check —
setImmediate()कॉलबैक का निष्पादन। - Close callbacks — क्लोजिंग इवेंट्स की प्रोसेसिंग (जैसे,
socket.on('close', ...))।
Event Loop के काम करने का उदाहरण:
const fs = require('fs');
console.log('प्रोग्राम की शुरुआत');
setTimeout(() => { console.log('टाइमर चालू हुआ');}, 0);
setImmediate(() => { console.log('setImmediate निष्पादित');});
fs.readFile(__filename, () => { console.log('फ़ाइल पढ़ी गई');});
console.log('प्रोग्राम का अंत');
// आउटपुट:// प्रोग्राम की शुरुआत// प्रोग्राम का अंत// setImmediate निष्पादित// टाइमर चालू हुआ// फ़ाइल पढ़ी गईयह समझना महत्वपूर्ण है: Event Loop कोड को मल्टीथ्रेडेड नहीं बनाता है, यह केवल कार्यों के बीच समय को कुशलतापूर्वक वितरित करता है। यदि कोई कार्य CPU को बहुत लंबे समय तक व्यस्त रखता है (जैसे, एक जटिल लूप), तो पूरा Event Loop ब्लॉक हो जाता है।
2. ब्लॉकिंग की समस्या और समाधान: Worker Threads
CPU-गहन कार्यों (एन्क्रिप्शन, इमेज प्रोसेसिंग, बड़े डेटा की पार्सिंग) के लिए, Event Loop उपयुक्त नहीं है - यह पूरे सर्वर को ब्लॉक कर देगा। यहाँ Worker Threads मदद के लिए आते हैं।
Worker Threads एक Node.js मॉड्यूल है जो आपको वास्तविक ऑपरेटिंग सिस्टम थ्रेड बनाने की अनुमति देता है। प्रत्येक वर्कर का अपना V8 इंस्टेंस और Event Loop होता है, जो कोड को समानांतर रूप से निष्पादित करने की अनुमति देता है।
Worker Threads के उपयोग का मूल उदाहरण:
// main.jsconst { Worker } = require('worker_threads');
function runWorker(workerData) { return new Promise((resolve, reject) => { const worker = new Worker('./worker.js', { workerData }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) { reject(new Error(`वर्कर कोड ${code} के साथ रुका`)); } }); });}
async function main() { console.log('वर्कर शुरू हो रहा है...'); const result = await runWorker(42); console.log('परिणाम:', result);}
main().catch(console.error);
// worker.jsconst { parentPort, workerData } = require('worker_threads');
// CPU-गहन कार्यfunction fibonacci(n) { if (n < 2) return n; return fibonacci(n - 1) + fibonacci(n -