एक कोरआउट एक जनरेटर फ़ंक्शन है जो मूल्यों को प्राप्त कर सकता है और बाहर से मूल्यों को स्वीकार कर सकता है। एक कोरटाइन का उपयोग करने का लाभ यह है कि हम किसी फ़ंक्शन के निष्पादन को रोक सकते हैं और इसे बाद में फिर से शुरू कर सकते हैं। नेटवर्क ऑपरेशन के मामले में, जब हम प्रतिक्रिया की प्रतीक्षा कर रहे होते हैं, तो यह किसी फ़ंक्शन के निष्पादन को रोक देता है। हम कुछ अन्य कार्यों को चलाने के लिए समय का उपयोग कर सकते हैं।
एक भविष्य Promiseजावास्क्रिप्ट से वस्तुओं की तरह है। यह मूल्य के लिए एक प्लेसहोल्डर की तरह है जो भविष्य में भौतिक होगा। नेटवर्क I / O पर प्रतीक्षा करते समय उपर्युक्त मामले में, एक फ़ंक्शन हमें एक कंटेनर दे सकता है, यह वादा करता है कि यह ऑपरेशन पूरा होने पर कंटेनर को मूल्य के साथ भर देगा। हम भविष्य की वस्तु को पकड़ते हैं और जब यह पूरा हो जाता है, तो हम वास्तविक परिणाम प्राप्त करने के लिए उस पर एक विधि कह सकते हैं।
प्रत्यक्ष उत्तर:ensure_future यदि आपको परिणामों की आवश्यकता नहीं है, तो आपको इसकी आवश्यकता नहीं है। वे अच्छे हैं यदि आपको परिणामों की आवश्यकता है या अपवाद प्राप्त हुआ है।
अतिरिक्त क्रेडिट: मैं अधिकतम कर्मचारियों की संख्या को नियंत्रित करने के लिए run_in_executorएक Executorउदाहरण चुनूंगा और पारित करूंगा ।
स्पष्टीकरण और नमूना कोड
पहले उदाहरण में, आप coroutines का उपयोग कर रहे हैं। waitसमारोह coroutines का एक समूह लेता है और उन्हें एक साथ जोड़ती है। इसलिए wait()जब सभी कोरआउट समाप्त हो जाते हैं (सभी मूल्यों को पूरा करते हुए पूरा / समाप्त हो जाता है)।
loop = get_event_loop() #
loop.run_until_complete(wait(coros))
run_until_completeविधि सुनिश्चित करें कि पाश जब तक निष्पादन समाप्त हो गया है जीवित है होगा। कृपया ध्यान दें कि आपको इस मामले में एसिंक्स निष्पादन के परिणाम कैसे नहीं मिल रहे हैं।
दूसरे उदाहरण में, आप ensure_futureएक coroutine को लपेटने के लिए फ़ंक्शन का उपयोग कर रहे हैं और एक Taskऑब्जेक्ट लौटाते हैं जो एक तरह का है Future। जब आप कॉल करते हैं तो कोरआउट मुख्य इवेंट लूप में निष्पादित किया जाता है ensure_future। लौटाए गए भविष्य / कार्य ऑब्जेक्ट का अभी तक कोई मूल्य नहीं है, लेकिन समय के साथ, जब नेटवर्क संचालन समाप्त हो जाता है, तो भविष्य की वस्तु ऑपरेशन के परिणाम को धारण करेगी।
from asyncio import ensure_future
futures = []
for i in range(5):
futures.append(ensure_future(foo(i)))
loop = get_event_loop()
loop.run_until_complete(wait(futures))
इस उदाहरण में, हम एक ही काम कर रहे हैं सिवाय इसके कि हम वायदा का उपयोग कर रहे हैं केवल कॉरटाइन का उपयोग करने के बजाय।
आइए एक उदाहरण देखें कि एसिंको / कोराउटाइन / फ्यूचर का उपयोग कैसे करें:
import asyncio
async def slow_operation():
await asyncio.sleep(1)
return 'Future is done!'
def got_result(future):
print(future.result())
# We have result, so let's stop
loop.stop()
loop = asyncio.get_event_loop()
task = loop.create_task(slow_operation())
task.add_done_callback(got_result)
# We run forever
loop.run_forever()
यहां, हमने ऑब्जेक्ट create_taskपर विधि का उपयोग किया है loop। ensure_futureमुख्य ईवेंट लूप में कार्य शेड्यूल करेगा। यह विधि हमें चुनने वाले लूप पर एक कोरटाइन शेड्यूल करने में सक्षम बनाती है।
हम add_done_callbackटास्क ऑब्जेक्ट पर विधि का उपयोग करके कॉलबैक जोड़ने की अवधारणा भी देखते हैं ।
एक Taskहै doneजब coroutine एक मान देता है, एक अपवाद को जन्म देती है या रद्द कर दिया जाता है। इन घटनाओं की जांच करने के तरीके हैं।
मैंने इन विषयों पर कुछ ब्लॉग पोस्ट लिखी हैं जिनसे मदद मिल सकती है:
बेशक, आप आधिकारिक मैनुअल पर अधिक जानकारी पा सकते हैं: https://docs.python.org/3/library/asyncio.html
ensure_future()? और अगर मुझे परिणाम की आवश्यकता है, तो क्या मैं अभी उपयोग नहीं कर सकता हूंrun_until_complete(gather(coros))?