जावास्क्रिप्ट में समवर्तीता और मल्टीथ्रेडिंग: A से Z तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जावास्क्रिप्ट में समवर्तीता और मल्टीथ्रेडिंग: A से Z तक

\n\n

जावास्क्रिप्ट ऐतिहासिक रूप से एक एकल-थ्रेडेड भाषा है जो इवेंट-संचालित प्रोग्रामिंग प्रतिमान के अंतर्गत काम करती है। हालाँकि, आधुनिक जावास्क्रिप्ट (विशेषकर Node.js वातावरण में) समवर्तीता और मल्टीथ्रेडिंग के लिए शक्तिशाली उपकरण प्रदान करता है। इस लेख में, हम समझेंगे कि Event Loop, Promises, async/await, Worker Threads और क्लस्टरीकरण कैसे काम करते हैं, और अपने अनुप्रयोगों के प्रदर्शन को बेहतर बनाने के लिए इन तंत्रों का उपयोग कैसे करें।

\n\n

1. Event Loop: जावास्क्रिप्ट में समवर्तीता का आधार

\n\n

Event Loop जावास्क्रिप्ट के एसिंक्रोनस मॉडल का हृदय है। यह मुख्य निष्पादन थ्रेड को ब्लॉक किए बिना कई संचालनों को संसाधित करने की अनुमति देता है। Node.js में, Event Loop कार्य कतारों (macrotasks और microtasks) का प्रबंधन करता है, जो नॉन-ब्लॉकिंग इनपुट-आउटपुट सुनिश्चित करता है।

\n\n

Event Loop के काम करने का उदाहरण:

\n\n
console.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\n

2. Promises और async/await: एसिंक्रोनसिटी का प्रबंधन

\n\n

Promises ऐसी वस्तुएँ हैं जो एसिंक्रोनस संचालन के परिणाम का प्रतिनिधित्व करती हैं। वे "callback hell" से बचने और कॉलों की श्रृंखला बनाने की अनुमति देते हैं। async/await, Promises पर सिंटैक्टिक शुगर है, जो एसिंक्रोनस कोड को सिंक्रोनस जैसा बनाता है।

\n\n

async/await के साथ उदाहरण:

\n\n
const 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() का उपयोग करके कई एसिंक्रोनस संचालनों को समानांतर रूप से निष्पादित करने की अनुमति देता है:

\n\n
const [user, posts] = await Promise.all([\n  fetchUser(userId),\n  fetchPosts(userId)\n]);\nconsole.log(user, posts);
\n\n

3. Worker Threads: Node.js में वास्तविक मल्टीथ्रेडिंग

\n\n

Node.js 10.5.0 से शुरू करके, मॉड्यूल worker_threads CPU-गहन कार्यों को निष्पादित करने के लिए वास्तविक थ्रेड बनाने की क्षमता प्रदान करता है। प्रत्येक Worker अपने स्वयं के V8 इंस्टेंस के साथ एक अलग थ्रेड में काम करता है।

\n\n

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\n

Worker Threads उन कार्यों के लिए आदर्श हैं जो Event Loop को ब्लॉक करते हैं: छवि प्रसंस्करण, गणितीय गणनाएँ, बड़ी फ़ाइलों का पार्सिंग।

\n\n

4. क्लस्टरीकरण: कई प्रक्रियाओं पर स्केलिंग

\n\

ब्लॉग

पुस्तक अनुशंसाएँ