वास्तविक जानकारी:
पायथन 3.7 से शुरू करके इस उद्देश्य के लिए asyncio.create_task(coro)
उच्च-स्तरीय समारोह जोड़ा गया ।
आपको इसका उपयोग कोरटाइम्स से कार्य बनाने के अन्य तरीकों के बजाय करना चाहिए। हालाँकि यदि आपको मनमाना प्रतीक्षा से कार्य बनाने की आवश्यकता है, तो आपको उपयोग करना चाहिए asyncio.ensure_future(obj)
।
पुरानी जानकारी:
ensure_future
बनाम create_task
ensure_future
बनाने के लिए एक विधि है Task
से coroutine
। यह तर्क के आधार पर अलग-अलग तरीकों से कार्य बनाता है ( create_task
कोरटाइन और भविष्य जैसी वस्तुओं के उपयोग के लिए)।
create_task
की एक अमूर्त विधि है AbstractEventLoop
। अलग-अलग इवेंट लूप इस फ़ंक्शन को अलग-अलग तरीकों से लागू कर सकते हैं।
आपको ensure_future
कार्य बनाने के लिए उपयोग करना चाहिए । आपको create_task
केवल तभी आवश्यकता होगी जब आप अपना स्वयं का ईवेंट लूप प्रकार लागू करने जा रहे हों।
युपीडी:
@ bj0 ने इस विषय पर गुइडो के उत्तर की ओर इशारा किया :
इसका मतलब यह है ensure_future()
कि यदि आपके पास कुछ ऐसा है जो या तो एक कोरटाइन हो सकता है या Future
(उत्तरार्द्ध में एक Task
उप-वर्ग शामिल है क्योंकि Future
), और आप उस पर एक विधि को कॉल करने में सक्षम होना चाहते हैं जो केवल परिभाषित है Future
(शायद केवल के बारे में) उपयोगी उदाहरण cancel()
)। जब यह पहले से ही है Future
(या Task
) यह कुछ नहीं करता है; जब यह एक coroutine होता है तो इसे एक में लपेट देता है Task
।
यदि आप जानते हैं कि आपके पास एक कॉरआउट है और आप इसे शेड्यूल करना चाहते हैं, तो उपयोग करने के लिए सही एपीआई है create_task()
। केवल तभी जब आपको कॉल किया जाना चाहिए ensure_future()
, जब आप एक एपीआई प्रदान कर रहे हों (जैसे कि एसिंनसियो के अपने एपीआई में से अधिकांश) जो या तो एक कॉरआउट या एक को स्वीकार करता है Future
और आपको इसके लिए कुछ करने की आवश्यकता होती है जिसके लिए आपको एक होना चाहिए Future
।
और बादमें:
अंत में मुझे अभी भी विश्वास है कि ensure_future()
कार्यक्षमता के शायद ही कभी आवश्यक टुकड़े के लिए एक उचित अस्पष्ट नाम है। एक कोरटाइन से कार्य बनाते समय आपको उचित रूप से नामित का उपयोग करना चाहिए
loop.create_task()
। हो सकता है कि इसके लिए एक उपनाम होना चाहिए
asyncio.create_task()
?
यह मेरे लिए आश्चर्य की बात है। ensure_future
सभी के साथ उपयोग करने के लिए मेरी मुख्य प्रेरणा यह थी कि यह लूप के सदस्य की तुलना में उच्च-स्तरीय फ़ंक्शन है create_task
(चर्चा में कुछ विचार शामिल हैं जैसे जोड़ना asyncio.spawn
या asyncio.create_task
)।
मैं यह भी कह सकता हूं कि मेरी राय में यह सार्वभौमिक कार्य का उपयोग करने के लिए बहुत सुविधाजनक है जो Awaitable
केवल कोरटाइन के बजाय किसी भी संभाल सकता है ।
हालांकि, गुइडो का जवाब स्पष्ट है: "जब एक कोरटाइन से एक कार्य बनाते हैं तो आपको उचित रूप से नामित का उपयोग करना चाहिए loop.create_task()
"
जब कोरटाइन को कार्यों में लपेटा जाना चाहिए?
एक टास्क में कॉरपेट लपेटें - इस कॉरआउट को "पृष्ठभूमि में" शुरू करने का एक तरीका है। यहाँ उदाहरण है:
import asyncio
async def msg(text):
await asyncio.sleep(0.1)
print(text)
async def long_operation():
print('long_operation started')
await asyncio.sleep(3)
print('long_operation finished')
async def main():
await msg('first')
# Now you want to start long_operation, but you don't want to wait it finised:
# long_operation should be started, but second msg should be printed immediately.
# Create task to do so:
task = asyncio.ensure_future(long_operation())
await msg('second')
# Now, when you want, you can await task finised:
await task
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
आउटपुट:
first
long_operation started
second
long_operation finished
आप asyncio.ensure_future(long_operation())
केवल await long_operation()
अंतर महसूस करने के लिए बदल सकते हैं ।
create_task
यदि आपको वास्तव में