जावास्क्रिप्ट/टाइपस्क्रिप्ट की सिंगल-थ्रेडेड प्रकृति: एसिंक्स प्रोग्रामिंग

Jan 20 2023
अपने पहले लेख में मैंने JS और TS के बीच कुछ अंतरों के बारे में लिखा था। अब हम एकल थ्रेडेड भाषा के रूप में async प्रकृति का पता लगाने जा रहे हैं।

अपने पहले लेख में मैंने JS और TS के बीच कुछ अंतरों के बारे में लिखा था।

अब हम एकल थ्रेडेड भाषा के रूप में async प्रकृति का पता लगाने जा रहे हैं ।

जावास्क्रिप्ट और टाइपस्क्रिप्ट में, एकल-थ्रेडेड प्रकृति का अर्थ है कि एक निश्चित समय में केवल एक ही कार्य निष्पादित किया जा सकता है।

दूसरी ओर, एसिंक्स प्रोग्रामिंग भाषा की अतुल्यकालिक रूप से कार्य करने की क्षमता को संदर्भित करता है, जिससे निष्पादन के मुख्य धागे को अन्य कार्यों के पूरा होने की प्रतीक्षा करते हुए चलते रहने की अनुमति मिलती है। यह कॉलबैक , ईवेंट , वादे और async / प्रतीक्षा के उपयोग के माध्यम से प्राप्त किया जाता है ।

इससे पहले कि मैं इन्हें कोडिंग के संदर्भ में समझाना शुरू करूँ, मैं एक बहुत ही दिलचस्प संदर्भ के बारे में बात करना चाहूँगा कि जब हम मल्टीटास्किंग करने की कोशिश करते हैं तो एकल-थ्रेडेड भाषा के async कार्य हमारे मस्तिष्क के समान कैसे होते हैं ।

इस खंड में मैं काइल सिम्पसन की पुस्तक "यू डोंट नो जावास्क्रिप्ट" में एसिंक्रोनाइज़ेशन के साथ अनुक्रमिक मस्तिष्क के संबंध के बारे में लिखे गए एक लंबे पाठ / अध्याय को संक्षेप में प्रस्तुत करूँगा। यदि आप केवल कोडिंग भाग में रुचि रखते हैं कि यह कैसे काम करता है, तो आप इस भाग को छोड़ सकते हैं।

" मुझे पूरा यकीन है कि आप में से अधिकांश ने किसी को यह कहते सुना होगा (यहां तक ​​कि खुद दावा भी किया था), " मैं एक मल्टीटास्कर हूं। लेकिन क्या
हम मल्टीटास्कर हैं? क्या हम वास्तव में एक ही समय में दो सचेत, इरादतन कार्य कर सकते हैं और ठीक उसी क्षण दोनों के बारे में सोच/तर्क कर सकते हैं? क्या हमारे उच्चतम स्तर की मस्तिष्क कार्यक्षमता में समानांतर मल्टीथ्रेडिंग चल रही है?

जवाब आपको चौंका सकता है जो है: शायद नहीं।

ऐसा नहीं है कि वास्तव में हमारे दिमाग कैसे स्थापित होते हैं। हममें से बहुत से लोग जितना स्वीकार करना चाहते हैं, उससे कहीं अधिक हम अकेले काम करने वाले हैं। हम वास्तव में किसी भी पल में केवल एक ही चीज़ के बारे में सोच सकते हैं।

मैं हमारे सभी अनैच्छिक, अवचेतन, स्वचालित मस्तिष्क कार्यों के बारे में बात नहीं कर रहा हूँ, जैसे कि दिल की धड़कन, श्वास, और पलक झपकना। वे सभी हमारे निरंतर जीवन के लिए महत्वपूर्ण कार्य हैं, लेकिन हम जानबूझकर उन्हें कोई मस्तिष्क शक्ति आवंटित नहीं करते हैं।

सिम्पसन के अनुसार, मनुष्य वास्तव में मल्टीटास्किंग करने में उस तरह सक्षम नहीं है जैसे एक कंप्यूटर कर सकता है। हालांकि यह सच है कि मानव मस्तिष्क एक साथ कई कार्यों को संसाधित कर सकता है, लेकिन यह एक साथ सभी कार्यों पर समान ध्यान देने में सक्षम नहीं होता है। इसके बजाय, हम अपना ध्यान तेजी से कार्यों के बीच बदलते हैं, जैसे कि एक थ्रेडेड प्रोग्राम एक समय में केवल एक ही कार्य को निष्पादित कर सकता है।

शुक्र है, जब हम तीन मिनट में 15 वीं बार सोशल नेटवर्क फीड्स की जांच करने के बारे में सोचते हैं, तो हमारा मस्तिष्क उन सभी महत्वपूर्ण कार्यों के साथ पृष्ठभूमि (धागे!) में चलता रहता है।

जब हम नकली मल्टीटास्किंग करते हैं, जैसे फोन पर किसी दोस्त या परिवार के सदस्य से बात करते समय कुछ टाइप करने की कोशिश करते हैं, तो हम वास्तव में तेजी से संदर्भ स्विचर के रूप में काम कर रहे होते हैं । दूसरे शब्दों में, हम तेजी से उत्तराधिकार में दो या दो से अधिक कार्यों के बीच आगे और पीछे स्विच करते हैं, साथ ही साथ प्रत्येक कार्य पर छोटे, तेज छोटे हिस्से में प्रगति करते हैं। हम इसे इतनी तेजी से करते हैं कि बाहरी दुनिया को ऐसा लगता है जैसे हम इन चीजों को समानांतर में कर रहे हैं।

क्या आपको ऐसा लगता है कि async ईवेंटेड कॉन्करेंसी (जैसे JS में होता है) जैसा लगता है ?!

हम विभिन्न कार्यों की योजना कैसे बनाते हैं, और हमारा दिमाग वास्तव में उन कार्यों को कैसे संचालित करता है, इसके बीच एक बड़ा, देखने योग्य अंतर है।
भले ही एक परिचालन स्तर पर हमारे दिमाग एसिंक्रोनस इवेंटेड हैं, हम अनुक्रमिक, तुल्यकालिक तरीके से कार्यों की योजना बनाते हैं। "मुझे स्टोर जाना है, फिर कुछ दूध खरीदना है, फिर मेरी ड्राई क्लीनिंग छोड़ देना है।"

क्या आप वास्तव में सोच की एक ऐसी रेखा होने की कल्पना कर सकते हैं जो आपके टू-डू कामों की योजना इस तरह बनाती है:

" मुझे स्टोर जाना है (1), लेकिन रास्ते में मुझे यकीन है कि मुझे एक फोन कॉल आएगा (2) , इसलिए 'हाय, मॉम', और जब वह बात करना शुरू करेगी, तो मैं ऊपर देखूंगा स्टोर का पता (3) GPS पर, लेकिन उसे लोड होने में एक सेकंड लगेगा, इसलिए मैं रेडियो बंद कर दूँगा (4) ताकि मैं माँ को बेहतर तरीके से सुन सकूँ ...
तब मुझे एहसास होगा कि मैं जैकेट पहनना भूल गया ( 5) और बाहर ठंड है, लेकिन कोई बात नहीं, गाड़ी चलाते रहो और माँ से बात करो ...
और फिर सीट बेल्ट की डिंग मुझे सीट बेल्ट लगाने की याद दिलाती है (6) , इसलिए 'हाँ, माँ, मैं अपनी सीट बेल्ट लगाती हूँ, मैं हमेशा लगाती हूँ!' आह, अंत में:

जीपीएस को निर्देश मिल गए, अब…”

यह कितना हास्यास्पद लगता है कि हम अपने दिन की योजना कैसे बनाते हैं और क्या करना है और किस क्रम में सोचते हैं, इसके लिए एक सूत्रीकरण के रूप में, फिर भी यह वास्तव में है कि हमारा दिमाग कार्यात्मक स्तर पर कैसे काम करता है। लेकिन याद रखें, यह मल्टीटास्किंग नहीं है, यह केवल तेजी से संदर्भ स्विचिंग है।

इसे ध्यान में रखते हुए, आइए करीब से देखें कि जावास्क्रिप्ट में एसिंक्रोनस प्रोग्रामिंग कैसे काम करती है।

अब कोडिंग के लिए :

जावास्क्रिप्ट / टाइपस्क्रिप्ट में एसिंक्स प्रोग्रामिंग करने के कई तरीके हैं, जैसा कि मैंने इस लेख की शुरुआत में उल्लेख किया है, जिसमें उपयोग करना शामिल है: कॉलबैक , इवेंट्स, प्रॉमिस, एसिंक्स / अवेट।

  • कॉलबैक एक ऐसा फ़ंक्शन है जिसे किसी अन्य फ़ंक्शन के तर्क के रूप में पारित किया जाता है और बाहरी फ़ंक्शन पूरा होने के बाद निष्पादित किया जाता है। उदाहरण के लिए:
  • function greet(name, callback) {
      console.log(`Hello, ${name}!`);
      callback();
    }
    
    function sayGoodbye() {
      console.log("Goodbye!");
    }
    
    greet("John", sayGoodbye);
    // Output: "Hello, John!"
    // Output: "Goodbye!"
    

  • एक घटना एक संकेत है कि कुछ हुआ है, और एक श्रोता एक ऐसा कार्य है जिसे उस घटना के जवाब में निष्पादित किया जाता है। उदाहरण के लिए:
  • const button = document.querySelector("button");
    
    button.addEventListener("click", () => {
      console.log("Button was clicked!");
    });
    

  • एक वादा एक async ऑपरेशन के परिणाम का प्रतिनिधित्व करता है, और वास्तविक जीवन के वादों की तरह या तो हल किया जा सकता है (सफल) या अस्वीकृत (असफल); जब आप कोई वादा करते हैं तो आप या तो उसे पूरा करते हैं (समाधान करते हैं) या नहीं (अस्वीकार करते हैं)।
    वादों का उपयोग async संचालन को एक साथ जोड़ने की प्रक्रिया को आसान बनाने के लिए किया जा सकता है। उदाहरण के लिए:
  • const promise = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve("Completed Async Task");
      }, 1000);
    });
    
    promise.then((result) => {
      console.log(result);
    });
    // Output: "Async task completed" (after 1 second)
    

  • Async/प्रतीक्षा: जावास्क्रिप्ट की एक विशेषता जो async/प्रतीक्षा सिंटैक्स के उपयोग को async कोड को सिंक्रनाइज़ कोड की तरह दिखने और व्यवहार करने की अनुमति देती है। Async/प्रतीक्षा वादे के शीर्ष पर बनाया गया है और async कोड के साथ काम करना आसान बनाता है।
  • async function greet(name) {
      return `Hello, ${name}!`;
    }
    
    async function main() {
      const greeting = await greet("John");
      console.log(greeting);
    }
    
    main();
    // Output: "Hello, John!"
    

कुल मिलाकर, async प्रोग्रामिंग भाषा की एकल-थ्रेडेड प्रकृति को बनाए रखते हुए कई कार्यों के निष्पादन की अनुमति देती है। यह अन्य कार्यों के पूरा होने की प्रतीक्षा करते हुए मुख्य थ्रेड को चालू रखने की अनुमति देकर अधिक प्रतिक्रियाशील और कुशल प्रोग्राम की अनुमति देता है।

यदि आप इस सामग्री को पसंद करते हैं तो अनुसरण करने में संकोच न करें। और भी बहुत सी परियोजनाएँ हैं जिन पर मैं निकट भविष्य में लिखने की योजना बना रहा हूँ। तब तक,

पढ़ने के लिए आपका शुक्रिया!