जावास्क्रिप्ट में साझा मेमोरी का परिचय
शेयर्ड मेमोरी जावास्क्रिप्ट की एक उन्नत विशेषता है, जो थ्रेड्स (प्रक्रिया के समवर्ती रूप से निष्पादित भागों) का लाभ उठा सकते हैं। मेमोरी शेयर करने का मतलब है थ्रेड्स के बीच अद्यतन डेटा पास करने की परेशानी नहीं है और सभी थ्रेड्स साझा की गई मेमोरी में एक ही डेटा को एक्सेस और अपडेट कर सकते हैं.
क्या यह प्यारा नहीं है? हां तकरीबन। इस पोस्ट में, हम देखेंगे जावास्क्रिप्ट में साझा मेमोरी का उपयोग कैसे करें और अगर यह तय करना है कि आप वास्तव में क्या करना चाहते हैं.
साझा मेमोरी के फायदे और नुकसान
हम प्रयोग करते हैं वेब कर्मचारी सेवा मेरे जावास्क्रिप्ट में धागे बनाएँ. वेब वर्कर्स एपीआई हमें वर्कर थ्रेड बनाने की अनुमति देता है, जिनका उपयोग किया जा सकता है पृष्ठभूमि में कोड निष्पादित करें ताकि मुख्य धागा अपने निष्पादन को जारी रखने के लिए स्वतंत्र हो, संभवतः यूआई घटनाओं को संसाधित कर सके, कोई यूआई फ्रीज सुनिश्चित नहीं कर सके.
श्रमिक सूत्र मुख्य धागे और एक दूसरे के साथ समवर्ती रूप से चलाएं. किसी कार्य के विभिन्न भागों का एक साथ निष्पादन समय की बचत है। आप जल्दी खत्म कर देते हैं, लेकिन इसकी अपनी समस्याओं का सेट भी है.
सुनिश्चित करें कि प्रत्येक धागा आवश्यक संसाधन प्राप्त करता है और एक दूसरे के साथ समयबद्ध तरीके से संवाद करता है अपने आप में एक कार्य है, जहां एक दुर्घटना में एक आश्चर्यजनक परिणाम हो सकता है। या अगर एक थ्रेड डेटा बदल रहा है और दूसरा इसे पढ़ रहा है एक ही समय में, आपको क्या लगता है कि दूसरा धागा क्या देखेगा? अद्यतन या पुराना डेटा?
हालाँकि, वेब कर्मचारियों को पंगा लेना इतना आसान नहीं है। संदेशों का उपयोग करके उनके संचार के दौरान, वे एक दूसरे को जो डेटा भेजते हैं वह है मूल नहीं बल्कि एक प्रति, मतलब वे नहीं शेयर वही डेटा। वे एक दूसरे को डेटा की प्रतियां पास करें जब जरूरत.
लेकिन साझा करना देखभाल है, और कई थ्रेड्स को एक ही समय में एक ही डेटा को देखने और उन्हें बदलने की आवश्यकता हो सकती है। इसलिए, शेयरिंग पर प्रतिबंध लगाना कोई बड़ी बात नहीं है. यह वह जगह है जहाँ SharedArrayBuffer
वस्तु चित्र में आती है। यह हमें करने देगा बाइनरी डेटा को कई थ्रेड्स के बीच साझा करें.
SharedArrayBuffer
वस्तु
थ्रेड्स के बीच डेटा प्रतियां पारित करने के बजाय, हम की प्रतियां पास करें SharedArrayBuffer
वस्तु. ए SharedArrayBuffer
वस्तु मेमोरी को इंगित करता है जहां डेटा सहेजा गया है.
तो, जब की प्रतियां भी SharedArrayBuffer
धागे के बीच पारित कर रहे हैं, वे सभी अभी भी उसी मेमोरी की ओर इशारा करेंगे जहां मूल डेटा सहेजा जाता है। इस प्रकार, धागे कर सकते हैं डेटा को उसी मेमोरी में देखें और अपडेट करें.
वेब कार्यकर्ता के बिना शेयर्ड मेमोरी
यह देखने के लिए कि एक वेब कार्यकर्ता साझा मेमोरी का उपयोग किए बिना कैसे काम करता है, हम एक श्रमिक सूत्र बनाएँ तथा इसके लिए कुछ डेटा पास करें.
index.html
फ़ाइल रखती है मुख्य स्क्रिप्ट अंदर एक टैग, जैसा कि आप इसे नीचे देख सकते हैं:
const w = नए कार्यकर्ता ('कार्यकर्ता.जेएस'); var n = 9; w.postMessage (एन);
worker.js
फ़ाइल वहन करती है कार्यकर्ता स्क्रिप्ट:
onmessage = (e) => कंसोल.ग्रुप ('[कार्यकर्ता]'); कंसोल.लॉग ('मुख्य थ्रेड से प्राप्त डेटा:% i', e.data); console.groupEnd ();
ऊपर दिए गए कोड का उपयोग करके, हम निम्नलिखित प्राप्त करते हैं कंसोल में आउटपुट:
[कार्यकर्ता] मुख्य सूत्र से प्राप्त डेटा: ९
उपरोक्त स्निपेट के पूर्ण कोड स्पष्टीकरण के लिए आप वेब कार्यकर्ताओं पर मेरी उक्त पोस्ट पढ़ सकते हैं.
अभी के लिए, ध्यान रखें कि डेटा है धागे के बीच आगे और पीछे भेजा का उपयोग करते हुए संदेश भेजें()
तरीका। डेटा है दूसरी तरफ से प्राप्त किया संदेश
आयोजन प्रबंधकर्ता, घटना के मूल्य के रूप में डेटा
संपत्ति.
अब, अगर हम डेटा बदलें क्या यह प्राप्त होने वाले छोर पर अद्यतन दिखाई देगा? चलो देखते हैं:
const w = नए कार्यकर्ता ('कार्यकर्ता.जेएस'); var n = 9; w.postMessage (एन); n = 1;
जैसी उम्मीद थी, डेटा है नहीं अद्यतन किया गया:
[कार्यकर्ता] मुख्य सूत्र से प्राप्त डेटा: ९
वैसे भी ऐसा क्यों होगा? आईटी इस मुख्य स्क्रिप्ट से कार्यकर्ता को सिर्फ एक क्लोन भेजा गया.
वेब कार्यकर्ता साथ में शेयर्ड मेमोरी
अब, हम करेंगे उपयोग SharedArrayBuffer
वस्तु उसी उदाहरण में। हम एक नया बना सकते हैं SharedArrayBuffer
उदाहरण के लिए का उपयोग करते हुए नया
कीवर्ड. कंस्ट्रक्टर एक पैरामीटर लेता है; ए बाइट्स में लंबाई मान, बफर के आकार को निर्दिष्ट करना.
const w = नए कार्यकर्ता ('कार्यकर्ता.जेएस'); बफ = नया शेअरअरेब्रफर (1); var arr = new Int8Array (बफ); / * सेटिंग डेटा * / गिरफ्तार [0] = 9; / * कार्यकर्ता को बफर (कॉपी) भेजना * / w.postMessage (बफ);
ध्यान दें कि ए SharedArrayBuffer
वस्तु केवल एक साझा मेमोरी क्षेत्र का प्रतिनिधित्व करता है. सेवा मेरे बाइनरी डेटा देखें और बदलें, हमें एक उपयुक्त डेटा संरचना का उपयोग करने की आवश्यकता है (ए TypedArray
या ए आँकड़ों का खाका
वस्तु).
में index.html
फ़ाइल ऊपर, एक नया SharedArrayBuffer
केवल एक-बाइट लंबाई के साथ बनाया गया है। फिर, एक नया Int8Array
, जो एक प्रकार का है TypedArray
वस्तुओं का उपयोग किया जाता है के लिए डेटा सेट करें “9” प्रदान की बाइट अंतरिक्ष में.
onmessage = (e) => var arrest = new Int8Array (e.data); console.group ( '[कार्यकर्ता]'); कंसोल.लॉग ('मुख्य थ्रेड से प्राप्त डेटा:% i', गिरफ्तार [0]); console.groupEnd ();
Int8Array
कार्यकर्ता में भी इस्तेमाल किया जाता है बफ़र में डेटा देखें.
कंसोल में अपेक्षित मान प्रकट होता है कार्यकर्ता सूत्र से, जो वास्तव में हम चाहते थे:
[कार्यकर्ता] मुख्य सूत्र से प्राप्त डेटा: ९
चलिए अब मुख्य थ्रेड में डेटा को अपडेट करें यह देखने के लिए कि क्या परिवर्तन कार्यकर्ता में परिलक्षित होता है.
const w = new Worker ('कार्यकर्ता.js'), बफ = new SharedArrayBuffer (1); var arr = new Int8Array (बफ); / * सेटिंग डेटा * / गिरफ्तार [0] = 9; / * कार्यकर्ता को बफर (कॉपी) भेजना * / w.postMessage (बफ); / * डेटा बदलना * / गिरफ्तार करना [0] = 1;
और, जैसा कि आप नीचे देख सकते हैं, अपडेट कार्यकर्ता के अंदर प्रतिबिंबित करता है!
[कार्यकर्ता] मुख्य धागे से प्राप्त डेटा: १
लेकिन, कोड भी चारों ओर दूसरे तरीके से काम करने की जरूरत है: जब कार्यकर्ता में मूल्य पहली बार में बदलता है, तो भी अद्यतन करने की आवश्यकता है जब यह मुख्य धागे से मुद्रित होता है.
इस मामले में, हमारा कोड इस तरह दिखता है:
onmessage = (e) => var arrest = new Int8Array (e.data); console.group ( '[कार्यकर्ता]'); कंसोल.लॉग ('मुख्य थ्रेड से प्राप्त डेटा:% i', गिरफ्तार [0]); console.groupEnd (); / * डेटा बदलना * / गिरफ्तार करना [0] = 7; / * मुख्य थ्रेड पर पोस्टिंग * / पोस्टमेसेज (") ;;
कार्यकर्ता में डेटा को बदल दिया जाता है और एक खाली संदेश मुख्य थ्रेड पर पोस्ट किया जाता है यह संकेत देते हुए कि बफर में डेटा बदल दिया गया है और मुख्य धागे के आउटपुट के लिए तैयार है.
const w = new Worker ('कार्यकर्ता.js'), बफ = new SharedArrayBuffer (1); var arr = new Int8Array (बफ); / * सेटिंग डेटा * / गिरफ्तार [0] = 9; / * कार्यकर्ता को बफर (कॉपी) भेजना * / w.postMessage (बफ); / * डेटा बदलना * / गिरफ्तार करना [0] = 1; / * कार्यकर्ता के बदलने के बाद डेटा को प्रिंट करना * / w.onmessage = (e) => कंसोल.ग्रुप ('[मुख्य]'); कंसोल.लॉग ('वर्कर थ्रेड से प्राप्त किया गया अपडेटेड डेटा:% i', एरियर [0]) console.groupEnd ();
और, यह काम भी करता है! बफर में डेटा कार्यकर्ता के अंदर के डेटा के समान है.
[कार्यकर्ता] मुख्य थ्रेड से प्राप्त डेटा: 1 [मुख्य] वर्कर थ्रेड से प्राप्त डेटा अपडेट किया गया: 7
महत्व दोनों मामलों में अद्यतन दिखाई देता है; मुख्य और वर्कर थ्रेड दोनों समान डेटा को देख और बदल रहे हैं.
अंतिम शब्द
जैसा कि मैंने पहले उल्लेख किया है, जावास्क्रिप्ट में साझा मेमोरी का उपयोग करते हुए बिना डाउनसाइड के नहीं है. यह सुनिश्चित करने के लिए डेवलपर्स पर निर्भर है कि निष्पादन का क्रम पूर्वानुमान के अनुसार होता है और कोई भी दो धागे एक ही डेटा प्राप्त करने के लिए दौड़ रहे हैं क्योंकि कोई नहीं जानता कि ट्रॉफी कौन लेगा.
यदि आप साझा मेमोरी में अधिक रुचि रखते हैं, तो इसके प्रलेखन पर एक नजर डालें एटोमिक्स
वस्तु। एटमिक्स ऑब्जेक्ट आपको कुछ कठिनाइयों के साथ मदद कर सकता है, साझा मेमोरी से पढ़ने / लिखने की अप्रत्याशित प्रकृति को कम करके.