TypeScript में कंकरेंसी और मल्टीथ्रेडिंग: एडवांस्ड लेवल

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

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

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

TypeScript में कंकरेंसी और मल्टीथ्रेडिंग: एडवांस्ड लेवल

\n\n

आधुनिक वेब डेवलपमेंट और सर्वर-साइड प्रोग्रामिंग में एप्लिकेशन की परफॉरमेंस और रिस्पॉन्सिवनेस बेहद महत्वपूर्ण है। TypeScript, JavaScript का एक सुपरसेट होने के नाते, इसकी सिंगल-थ्रेडेड एक्जीक्यूशन मॉडल (Event Loop) को विरासत में लेता है। हालांकि, इमेज प्रोसेसिंग, क्रिप्टोग्राफी, और जटिल गणनाओं जैसे हेवी-ड्यूटी कार्यों के लिए सिर्फ एसिंक्रोनसी काफी नहीं है। एडवांस्ड लेवल पर, डेवलपर को यह समझना जरूरी है कि असली मल्टीथ्रेडिंग और शेयर्ड मेमोरी के साथ सुरक्षित तरीके से कैसे काम किया जाए। इस लेख में, हम प्रमुख मैकेनिज्म को कवर करेंगे: Web Workers (ब्राउज़र), Worker Threads (Node.js), SharedArrayBuffer और Atomics।

\n\n

1. Web Workers: ब्राउज़र में पैरेललिज़्म

\n\n

Web Workers ब्राउज़र एनवायरनमेंट में कोड को एक अलग थ्रेड में चलाने का प्रमुख तरीका है। Worker के पास DOM तक पहुंच नहीं होती, लेकिन यह मेन थ्रेड (UI) को ब्लॉक किए बिना भारी गणनाएं कर सकता है।

\n\n

TypeScript में Worker बनाने के लिए एक अलग फाइल को कंपाइल करना होता है। आइए एक उदाहरण देखें: बड़े फिबोनाची नंबरों की गणना।

\n\n

फ़ाइल worker.ts (worker.js में कंपाइल होती है):

\n
// worker.ts\nself.onmessage = (event: MessageEvent<number>) => {\n  const n = event.data;\n  const fib = (num: number): number => {\n    if (num <= 1) return num;\n    return fib(num - 1) + fib(num - 2);\n  };\n  const result = fib(n);\n  self.postMessage(result);\n};
\n\n

फ़ाइल main.ts:

\n
// main.ts\nconst worker = new Worker(new URL('./worker.js', import.meta.url));\n\nworker.postMessage(40);\n\nworker.onmessage = (event: MessageEvent<number>) => {\n  console.log(`परिणाम: ${event.data}`); // पूरा होने पर आउटपुट\n  worker.terminate();\n};\n\nworker.onerror = (error) => {\n  console.error('Worker में त्रुटि:', error.message);\n};
\n\n

महत्वपूर्ण बिंदु:

\n
    \n
  • Worker एक अलग थ्रेड में चलता है, लेकिन मेन थ्रेड के ग्लोबल वेरिएबल्स तक उसकी पहुंच नहीं होती।
  • \n
  • डेटा ट्रांसफर कॉपी (स्ट्रक्चर्ड क्लोनिंग) के जरिए होता है। बड़े डेटा के लिए Transferable objects (जैसे ArrayBuffer) का उपयोग करें।
  • \n
  • TypeScript में, रनटाइम एरर से बचने के लिए मैसेज में टाइप्स निर्दिष्ट करना अनिवार्य है।
  • \n
\n\n

2. Worker Threads: Node.js में मल्टीथ्रेडिंग

\n\n

सर्वर-साइड Node.js एनवायरनमेंट के लिए, Web Workers का एनालॉग worker_threads मॉड्यूल है। यह अपनी खुद की मेमोरी (V8 isolate) के साथ अलग-थलग थ्रेड बनाने की अनुमति देता है। यह CPU-इंटेंसिव ऑपरेशन जैसे हैशिंग या JSON पार्सिंग के लिए आदर्श है।

\n\n

उदाहरण: पासवर्ड हैशिंग के लिए Worker बनाना (worker.ts):

\n
// crypto-worker.ts\nimport { parentPort, workerData } from 'worker_threads';\nimport { createHash } from 'crypto';\n\nif (parentPort) {\n  const { password, salt } = workerData;\n  const hash = createHash('sha256')\n    .update(password + salt)\n    .digest('hex');\n  parentPort.postMessage(hash);\n}
\n\n

मुख्य फ़ाइल (main.ts):

\n
// main.ts\nimport { Worker } from 'worker_threads';\nimport path from 'path';\n\nfunction hashPassword(password: string, salt: string): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const worker = new Worker(path.resolve(__dirname, 'crypto-worker.js'), {\n      workerData: { password, salt }\n    });\n\n    worker.on('message', resolve);\n    worker.on('error', reject);\n    worker.on('exit', (code) => {\n      if (code !== 0) reject(new Error(`Worker कोड ${code} के साथ समाप्त हुआ`));\n    });\n  });\n}\n\n(async () => {\n  const hash = await hashPassword('mySecret', 'randomSalt');\n  console.log(`हैश: ${hash}`);\n})();
\n\n

Web Workers से मुख्य अंतर:

\n
    \n
  • Node.js में काम करता है, फाइल सिस्टम और प्रक्रिया तक पहुंच है।
  • \n
  • डेटा ट्रांसफर

ब्लॉग

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