प्रोग्रामिंग दुनिया में, "नॉन-ब्लॉकिंग" की अवधारणा व्यापक है। जावास्क्रिप्ट डेवलपर अक्सर "एसिंक्रोनस" शब्द का उपयोग करते हैं क्योंकि यह जावास्क्रिप्ट की खूबियों में से एक है। हालाँकि, वास्तव में अतुल्यकालिक प्रोग्रामिंग को समझने के लिए, समवर्ती और समानांतर प्रोग्रामिंग की अवधारणाओं को समझना आवश्यक है।
जब कई स्वतंत्र संस्थाएं एक साथ काम कर रही हों, तो प्रोग्रामिंग समवर्ती होती है। इसका मतलब यह नहीं है कि ये कार्य बिल्कुल एक ही समय पर चल रहे हैं। इसके बजाय, इसका मतलब है कि सीपीयू समय जैसे संसाधनों को साझा करके कार्य समय के साथ प्रगति कर रहे हैं। समवर्ती प्रोग्रामिंग का मुख्य लाभ इसकी मजबूती है: यदि एक प्रक्रिया क्रैश हो जाती है, तो आपका बाकी प्रोग्राम कार्य करना जारी रखता है।
यदि कोई एल्गोरिदम अपने कार्य को कई भागों में विभाजित कर सकता है, तो यह समानांतर है। आपके पास जितने अधिक प्रोसेसर होंगे, आपको समानता से उतना अधिक लाभ होगा। कुशल समानांतर प्रोग्रामिंग बेहतर प्रदर्शन के लिए आधुनिक मशीनों के संसाधनों का अनुकूलन करती है।
समवर्ती उदाहरण:
कल्पना करें कि आप एक भोजन तैयार कर रहे हैं जहां आपको कुछ मांस को भूनना है और सॉस बनाना है। आप मांस को बारबेक्यू पर रखकर शुरू करें। जब मांस ग्रिल हो रहा हो, तो आप सॉस के लिए टमाटर और अन्य सब्जियाँ काट लें। फिर, आप कभी-कभी मांस की जांच करते हुए सॉस को उबालना शुरू कर देते हैं। यहां, दोनों कार्य (मांस को भूनना और सॉस बनाना) चल रहे हैं, लेकिन आप अपना ध्यान उन दोनों के बीच में लगा रहे हैं। यह समवर्तीता का प्रतिनिधित्व करता है।
समानांतरता उदाहरण:
अब, मान लीजिए कि आपकी मदद करने के लिए आपके पास एक दोस्त है। जब आप मांस को भूनने पर ध्यान केंद्रित करते हैं, तो आपका मित्र सॉस बनाने का ध्यान रखता है। दोनों कार्य एक साथ किए जा रहे हैं, बिना उनके बीच ध्यान लगाने की आवश्यकता के। यह समानता का प्रतिनिधित्व करता है।
एसिंक्रोनस प्रोग्रामिंग में आपके प्रोग्राम के बाहर होने वाले इनपुट/आउटपुट (आई/ओ) संचालन को संभालना शामिल है, जैसे उपयोगकर्ता इनपुट, टर्मिनल पर प्रिंट करना, सॉकेट से पढ़ना, या डिस्क पर लिखना। अतुल्यकालिक I/O की प्रमुख विशेषताएं हैं:
ऑपरेशन में लगने वाला समय सीपीयू पर निर्भर नहीं है। इसके बजाय, यह डिस्क गति, नेटवर्क विलंबता और अन्य बाहरी स्थितियों जैसे कारकों पर निर्भर करता है।
प्रोग्राम भविष्यवाणी नहीं कर सकता कि ऑपरेशन कब खत्म होगा।
महत्वपूर्ण I/O (जैसे वेब सर्वर, डेटाबेस और परिनियोजन स्क्रिप्ट) वाली सेवाओं के लिए, इन परिचालनों को अनुकूलित करने से प्रदर्शन में काफी सुधार हो सकता है।
आइए ब्लॉकिंग कोड और नॉन-ब्लॉकिंग कोड के उदाहरण देखें।
एक सरल कार्यक्रम पर विचार करें:
import time def task(): time.sleep(2) print("Hello") for _ in range(3): task()
इस सिंक्रोनस प्रोग्राम में, प्रत्येक कार्य पिछले कार्य के समाप्त होने की प्रतीक्षा करता है, जिससे देरी होती है।
अब, आइए asyncio का उपयोग करके एक अतुल्यकालिक संस्करण देखें:
import asyncio async def task(): await asyncio.sleep(2) print("Hello") async def main(): tasks = [task() for _ in range(3)] await asyncio.gather(*tasks) asyncio.run(main())
इस एसिंक्रोनस प्रोग्राम में, कार्य समवर्ती रूप से चलते हैं, जिससे कुल निष्पादन समय कम हो जाता है। आइए एसिंक्रोनस प्रोग्रामिंग के घटकों का पता लगाएं।
इवेंट लूप, कोरआउट्स और फ़्यूचर्स एक एसिंक्रोनस पायथन प्रोग्राम के आवश्यक तत्व हैं।
इवेंट लूप: अतुल्यकालिक रूप से चलाए जाने वाले कार्यों का ट्रैक रखते हुए, कार्य स्विचिंग और निष्पादन प्रवाह को प्रबंधित करता है।
Coroutines: विशेष कार्य जिन्हें रोका और फिर से शुरू किया जा सकता है, जिससे प्रतीक्षा के दौरान अन्य कार्य चल सकते हैं। एक कोरआउटिन निर्दिष्ट करता है कि फ़ंक्शन में कार्य-स्विचिंग ईवेंट कहां होना चाहिए, जिससे ईवेंट लूप पर नियंत्रण लौट आए। कॉरआउट्स आमतौर पर इवेंट लूप द्वारा बनाए जाते हैं और आंतरिक रूप से एक कार्य कतार में संग्रहीत होते हैं।
फ्यूचर्स: कोरटाइन से परिणामों के लिए प्लेसहोल्डर, परिणाम या अपवाद संग्रहीत करते हैं। जैसे ही ईवेंट लूप एक कोरआउटिन शुरू करता है, एक संबंधित भविष्य बनाया जाता है जो कोरटाइन के परिणाम को संग्रहीत करता है, या एक अपवाद यदि कोरटाइन के निष्पादन के दौरान फेंक दिया गया था।
पायथन में एसिंक्रोनस प्रोग्रामिंग के महत्वपूर्ण भागों की व्याख्या के साथ, आइए कुछ कोड लिखें।
अब जब आप एसिंक्रोनस प्रोग्रामिंग पैटर्न को समझ गए हैं, तो आइए एक छोटी स्क्रिप्ट लिखें और निष्पादन का विश्लेषण करें। यहाँ एक सरल अतुल्यकालिक स्क्रिप्ट है:
import asyncio async def task(): await asyncio.sleep(2) print("Hello") async def main(): tasks = [task() for _ in range(3)] await asyncio.gather(*tasks) asyncio.run(main())
उपरोक्त कोड में, हम अन्य कार्यों के निष्पादन को जारी रखने का प्रयास कर रहे हैं, भले ही निष्पादन करने वाला कोई दूसरा व्यक्ति सो रहा हो (अवरुद्ध कर रहा हो)। कार्य और मुख्य कार्यों के सामने async कीवर्ड पर ध्यान दें।
वे फ़ंक्शन अब कोरआउट्स हैं।
पायथन में Coroutines फ़ंक्शन कीवर्ड async से पहले आते हैं। यहां मुख्य() फ़ंक्शन कार्य समन्वयक या हमारा एकल ईवेंट लूप है, क्योंकि यह async.gather पद्धति का उपयोग करके सभी कार्यों को निष्पादित करता है। Asyncio.gather फ़ंक्शन प्रतीक्षा योग्य ऑब्जेक्ट को समवर्ती रूप से चलाता है।
आउटपुट:
Hello Hello Hello Program executed in 2.01 seconds.
जब प्रत्येक कार्य wait asyncio.sleep(2) पर पहुंच जाता है, तो यह बस अगले कार्य पर चला जाता है और समाप्त होने पर वापस आ जाता है। यह कहने जैसा है, "मैं 2 सेकंड के लिए सोने जा रहा हूं। कुछ और करो।"
आइए त्वरित तुलना के लिए सिंक्रोनस संस्करण देखें।
import time def task(): time.sleep(2) print("Hello") for _ in range(3): task()
उपरोक्त कोड में, हम पायथन में पारंपरिक प्रोग्रामिंग तरीके पर जा रहे हैं। आप देखेंगे कि प्रक्रिया के निष्पादन में अधिक समय लगेगा।
आउटपुट:
Hello Hello Hello Program executed in 6.01 seconds.
अब आप निष्पादन समय देख सकते हैं। time.sleep() को एक अवरुद्ध कार्य के रूप में और asyncio.sleep() को एक गैर-अवरुद्ध या लंबे कार्य के रूप में सोचें। एसिंक्रोनस प्रोग्रामिंग में, asyncio.sleep() जैसी किसी चीज़ की प्रतीक्षा करने का लाभ यह है कि आसपास का फ़ंक्शन अस्थायी रूप से किसी अन्य फ़ंक्शन को नियंत्रण सौंप सकता है जो तुरंत निष्पादित करने के लिए तैयार है।
पायथन में एसिंक्रोनस प्रोग्रामिंग के कुछ बुनियादी उदाहरणों को समझने के साथ, आइए पायथन में एसिंक्रोनस प्रोग्रामिंग के नियमों का पता लगाएं।
Coroutines: Coroutines को सीधे निष्पादित नहीं किया जा सकता है। यदि आप किसी कोरआउटिन फ़ंक्शन को सीधे चलाने का प्रयास करते हैं, तो यह एक कोरआउटिन ऑब्जेक्ट लौटाता है। इसके बजाय, asyncio.run():
का उपयोग करें
import asyncio async def hello(): await asyncio.sleep(1) print('Hello') asyncio.run(hello())
प्रतीक्षा योग्य वस्तुएं: कोरआउट्स, वायदा और कार्य मुख्य प्रतीक्षा योग्य वस्तुएं हैं। पायथन कॉरआउट्स प्रतीक्षा योग्य हैं और अन्य कॉरआउट्स से इसकी प्रतीक्षा की जा सकती है।
प्रतीक्षा कीवर्ड:प्रतीक्षा का उपयोग केवल एसिंक फ़ंक्शन के भीतर ही किया जा सकता है।
async def hello(): await asyncio.sleep(1) print("Hello")
संगतता: सभी पायथन मॉड्यूल अतुल्यकालिक प्रोग्रामिंग के साथ संगत नहीं हैं। उदाहरण के लिए, wait asyncio.sleep() को time.sleep() से बदलने पर त्रुटि उत्पन्न होगी। आप यहां संगत और अनुरक्षित मॉड्यूल की सूची देख सकते हैं।
अगले भाग में, हम एसिंक्रोनस प्रोग्रामिंग, HTTP अनुरोधों के सामान्य उपयोग का पता लगाएंगे।
आइए कोड के निम्नलिखित भाग पर एक नज़र डालें:
import aiohttp import asyncio async def fetch(session, city): url = f"https://www.prevision-meteo.ch/services/json/{city}" async with session.get(url) as response: data = await response.json() print(f"Temperature at {city}: {data['current_condition']['tmp']} C") async def main(): async with aiohttp.ClientSession() as session: cities = ['paris', 'toulouse', 'marseille'] tasks = [fetch(session, city) for city in cities] await asyncio.gather(*tasks) asyncio.run(main())
उपरोक्त कोड में, हम दो अतुल्यकालिक फ़ंक्शन बनाते हैं: एक प्रीविज़न-मेटियो यूआरएल से डेटा लाने के लिए और एक मुख्य फ़ंक्शन पायथन कोड में प्रक्रियाओं को निष्पादित करने के लिए। लक्ष्य तापमान प्राप्त करने और प्रतिक्रियाओं को प्रिंट करने के लिए अतुल्यकालिक HTTP GET अनुरोध भेजना है।
मुख्य और फ़ेच फ़ंक्शंस में, हम async with का उपयोग करते हैं। फ़ेच फ़ंक्शन में, async with यह सुनिश्चित करता है कि कनेक्शन ठीक से बंद है। मुख्य फ़ंक्शन में, यह सुनिश्चित करता है कि अनुरोध पूरा करने के बाद क्लाइंटसेशन बंद हो गया है। संसाधनों को कुशलतापूर्वक प्रबंधित करने और लीक को रोकने के लिए पायथन में एसिंक्रोनस कोडिंग में ये प्रथाएं महत्वपूर्ण हैं।
मुख्य फ़ंक्शन की अंतिम पंक्ति में, हम wait asyncio.gather(*tasks) का उपयोग करते हैं। हमारे मामले में, यह सभी कार्यों को एक साथ चलाता है, जिससे प्रोग्राम को एक साथ कई HTTP अनुरोध भेजने की अनुमति मिलती है। प्रतीक्षा का उपयोग यह सुनिश्चित करता है कि प्रोग्राम आगे बढ़ने से पहले सभी कार्यों के पूरा होने की प्रतीक्षा करता है।
आउटपुट:
Temperature at marseille: 25 C Temperature at toulouse: 24 C Temperature at paris: 18 C Program executed in 5.86 seconds.
कोड:
import requests import time def fetch(city): url = f"https://www.prevision-meteo.ch/services/json/{city}" response = requests.get(url) data = response.json() print(f"Temperature at {city}: {data['current_condition']['tmp']} C") def main(): cities = ['paris', 'toulouse', 'marseille'] for city in cities: fetch(city) start_time = time.time() main() print(f"Program executed in {time.time() - start_time:.2f} seconds.")
आउटपुट:
Temperature at Paris: 18 C Temperature at Toulouse: 24 C Temperature at Marseille: 25 C Program executed in 9.01 seconds.
एसिंक्रोनस मॉडल सबसे अच्छा प्रदर्शन करता है जब:
बड़ी संख्या में कार्य हैं, यह सुनिश्चित करना कि कम से कम एक कार्य हमेशा प्रगति कर सके।
कार्यों में महत्वपूर्ण I/O शामिल होता है, जिससे एक एसिंक्रोनस प्रोग्राम अन्य कार्यों के चलने के दौरान अवरुद्ध होने में बहुत समय बर्बाद करता है।
कार्य काफी हद तक स्वतंत्र होते हैं, अंतर-कार्य संचार को कम करते हैं (और इस प्रकार एक कार्य के लिए दूसरे कार्य की प्रतीक्षा करनी पड़ती है)।
इस ट्यूटोरियल में, हमने कवर किया:
एसिंक्रोनस प्रोग्रामिंग और संबंधित अवधारणाओं की अवधारणाएं।
async/प्रतीक्षा का प्रभावी उपयोग।
aiohttp के साथ अतुल्यकालिक HTTP अनुरोध करना।
एसिंक्रोनस प्रोग्रामिंग के लाभ।
पढ़ने के लिए धन्यवाद। दूसरा भाग Django के साथ अतुल्यकालिक प्रोग्रामिंग को कवर करेगा।
पायथन दस्तावेज़ीकरण: कोरआउट्स और कार्य
पायथन दस्तावेज़ीकरण: asyncio - एसिंक्रोनस I/O
aiohttp दस्तावेज़ीकरण
एओ लाइब्रेरीज़
संगति बनाम समांतरता
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3