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

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

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

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

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



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



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



मॉड्यूल worker_threads Node.js 10.5.0 में दिखाई दिया और यह अपने स्वयं के V8-इंजन के साथ अलग-अलग थ्रेड बनाने की अनुमति देता है। क्लस्टरीकरण (प्रक्रियाओं) के विपरीत, Worker Threads मेमोरी साझा करते हैं और SharedArrayBuffer के माध्यम से डेटा का आदान-प्रदान कर सकते हैं।



वर्कर बनाना और चलाना



// main.jsconst { Worker } = require('worker_threads');

function runWorker(data) { return new Promise((resolve, reject) => { const worker = new Worker('./worker.js', { workerData: data }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); });}

(async () => { const result = await runWorker({ numbers: [1, 2, 3, 4, 5] }); console.log('परिणाम:', result); // { sum: 15 }})();


// worker.jsconst { parentPort, workerData } = require('worker_threads');

const sum = workerData.numbers.reduce((acc, val) => acc + val, 0);parentPort.postMessage({ sum });


महत्वपूर्ण: वर्कर्स के पास DOM या मुख्य थ्रेड की आवश्यकता वाले मॉड्यूल तक पहुंच नहीं है। इन्हें भारी गणना, इमेज प्रोसेसिंग या एन्क्रिप्शन के लिए उपयोग करें।



2. SharedArrayBuffer और Atomics: साझा मेमोरी



SharedArrayBuffer कई वर्कर्स को एक ही मेमोरी क्षेत्र में डेटा पढ़ने और लिखने की अनुमति देता है। पहुंच को सिंक्रोनाइज़ करने के लिए Atomics ऑब्जेक्ट का उपयोग किया जाता है - यह परमाणु संचालन की गारंटी देता है।



उदाहरण: ऐरे का समानांतर प्रसंस्करण



// main.jsconst { Worker } = require('worker_threads');const { SharedArrayBuffer } = require('worker_threads');

const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10);const array = new Int32Array(buffer);

// ऐरे भरेंfor (let i = 0; i < 10; i++) array[i] = i;

const worker1 = new Worker('./worker_atomics.js', { workerData: { start: 0, end: 5 } });const worker2 = new Worker('./worker_atomics.js', { workerData: { start: 5, end: 10 } });

worker1.on('message', () => console.log('Worker 1 पूरा हुआ'));worker2.on('message', () => console.log('Worker 2 पूरा हुआ'));


// worker_atomics.jsconst { parentPort, workerData } = require('worker_threads');const { Atomics } = require('worker_threads');

const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10);const array = new Int32Array(buffer);

// प्रत्येक तत्व का परमाणु वृद्धिfor (let i = workerData.start; i < workerData.end; i++) { Atomics.add(array, i, 10);}

parentPort.postMessage('done');


नोट: थ्रेड्स को सिंक्रोनाइज़ करने के लिए Atomics.wait() और Atomics.notify() का उपयोग करें (म्यूटेक्स का एनालॉग)। रेस कंडीशन को रोकने के लिए यह महत्वपूर्ण है।



3. क्लस्टरीकरण: प्रक्रियाओं के माध्यम से स्केलिंग



मॉड्यूल cluster कई Node.js प्रक्रियाएं (वर्कर्स) बनाता है, जिनमें से प्रत्येक अनुरोधों को संसाधित करता है। मल्टी-कोर सिस्टम पर HTTP सर्वर को स्केल करने का यह मानक तरीका है।



उदाहरण: क्लस्टरीकृत HTTP सर्वर



const cluster = require('cluster');const http = require('http');const numCPUs = require('os').cpus().length;

if (cluster.isMaster) { console.

ब्लॉग

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