जावास्क्रिप्ट में समवर्तीता और मल्टीथ्रेडिंग: A से Z तक
\n\nजावास्क्रिप्ट ऐतिहासिक रूप से एक एकल-थ्रेडेड भाषा है जो इवेंट-संचालित प्रोग्रामिंग प्रतिमान के अंतर्गत काम करती है। हालाँकि, आधुनिक जावास्क्रिप्ट (विशेषकर Node.js वातावरण में) समवर्तीता और मल्टीथ्रेडिंग के लिए शक्तिशाली उपकरण प्रदान करता है। इस लेख में, हम समझेंगे कि Event Loop, Promises, async/await, Worker Threads और क्लस्टरीकरण कैसे काम करते हैं, और अपने अनुप्रयोगों के प्रदर्शन को बेहतर बनाने के लिए इन तंत्रों का उपयोग कैसे करें।
\n\n1. Event Loop: जावास्क्रिप्ट में समवर्तीता का आधार
\n\nEvent Loop जावास्क्रिप्ट के एसिंक्रोनस मॉडल का हृदय है। यह मुख्य निष्पादन थ्रेड को ब्लॉक किए बिना कई संचालनों को संसाधित करने की अनुमति देता है। Node.js में, Event Loop कार्य कतारों (macrotasks और microtasks) का प्रबंधन करता है, जो नॉन-ब्लॉकिंग इनपुट-आउटपुट सुनिश्चित करता है।
\n\nEvent Loop के काम करने का उदाहरण:
\n\nconsole.log('शुरू');\n\nsetTimeout(() => {\n console.log('टाइमर 1');\n}, 0);\n\nprocess.nextTick(() => {\n console.log('nextTick');\n});\n\nPromise.resolve().then(() => {\n console.log('Promise');\n});\n\nconsole.log('अंत');\n\n// आउटपुट:\n// शुरू\n// अंत\n// nextTick\n// Promise\n// टाइमर 1\n\nनिष्पादन के क्रम को समझना महत्वपूर्ण है: सिंक्रोनस कोड → microtasks (process.nextTick, Promise.then) → macrotasks (setTimeout, setInterval)।
\n\n2. Promises और async/await: एसिंक्रोनसिटी का प्रबंधन
\n\nPromises ऐसी वस्तुएँ हैं जो एसिंक्रोनस संचालन के परिणाम का प्रतिनिधित्व करती हैं। वे "callback hell" से बचने और कॉलों की श्रृंखला बनाने की अनुमति देते हैं। async/await, Promises पर सिंटैक्टिक शुगर है, जो एसिंक्रोनस कोड को सिंक्रोनस जैसा बनाता है।
\n\nasync/await के साथ उदाहरण:
\n\nconst fetchData = async (url) => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP त्रुटि: ${response.status}`);\n }\n return await response.json();\n};\n\nconst main = async () => {\n try {\n const data = await fetchData('https://api.example.com/data');\n console.log('प्राप्त डेटा:', data);\n } catch (error) {\n console.error('त्रुटि:', error.message);\n }\n};\n\nmain();\n\nयह दृष्टिकोण Promise.all() का उपयोग करके कई एसिंक्रोनस संचालनों को समानांतर रूप से निष्पादित करने की अनुमति देता है:
const [user, posts] = await Promise.all([\n fetchUser(userId),\n fetchPosts(userId)\n]);\nconsole.log(user, posts);\n\n3. Worker Threads: Node.js में वास्तविक मल्टीथ्रेडिंग
\n\nNode.js 10.5.0 से शुरू करके, मॉड्यूल worker_threads CPU-गहन कार्यों को निष्पादित करने के लिए वास्तविक थ्रेड बनाने की क्षमता प्रदान करता है। प्रत्येक Worker अपने स्वयं के V8 इंस्टेंस के साथ एक अलग थ्रेड में काम करता है।
Worker बनाने का उदाहरण:
\n\n// main.js\nconst { Worker } = require('worker_threads');\n\nconst runWorker = (workerData) => {\n return new Promise((resolve, reject) => {\n const worker = new Worker('./worker.js', { workerData });\n\n worker.on('message', resolve);\n worker.on('error', reject);\n worker.on('exit', (code) => {\n if (code !== 0) {\n reject(new Error(`Worker कोड ${code} के साथ रुका`));\n }\n });\n });\n};\n\nconst main = async () => {\n const result = await runWorker({ iterations: 1000000 });\n console.log('परिणाम:', result);\n};\n\nmain();\n\n// worker.js\nconst { parentPort, workerData } = require('worker_threads');\n\nconst heavyComputation = (iterations) => {\n let result = 0;\n for (let i = 0; i < iterations; i++) {\n result += Math.sqrt(i);\n }\n return result;\n};\n\nconst result = heavyComputation(workerData.iterations);\nparentPort.postMessage(result);\n\nWorker Threads उन कार्यों के लिए आदर्श हैं जो Event Loop को ब्लॉक करते हैं: छवि प्रसंस्करण, गणितीय गणनाएँ, बड़ी फ़ाइलों का पार्सिंग।
\n\n