मान लें कि हमारे पास एक डमी फ़ंक्शन है:
async def foo(arg):
result = await some_remote_call(arg)
return result.upper()
के बीच क्या अंतर है:
import asyncio
coros = []
for i in range(5):
coros.append(foo(i))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(coros))
तथा:
import asyncio
futures = []
for i in range(5):
futures.append(asyncio.ensure_future(foo(i)))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(futures))
नोट : उदाहरण एक परिणाम देता है, लेकिन यह सवाल का फोकस नहीं है। जब वापसी मूल्य मायने रखता है, के gather()
बजाय का उपयोग करें wait()
।
वापसी मूल्य के बावजूद, मैं स्पष्टता की तलाश कर रहा हूं ensure_future()
। wait(coros)
और wait(futures)
दोनों ही कोरआउट्स चलाते हैं, इसलिए कोरआउट कब और क्यों लपेटा जाना चाहिए ensure_future
?
मूल रूप से, पायथन 3.5 के उपयोग से नॉन-ब्लॉकिंग ऑपरेशन का एक गुच्छा चलाने के लिए राइट वे (टीएम) async
क्या है?
अतिरिक्त क्रेडिट के लिए, क्या होगा यदि मैं कॉल को बैचना चाहता हूं? उदाहरण के लिए, मुझे some_remote_call(...)
1000 बार कॉल करने की आवश्यकता है , लेकिन मैं 1000 एक साथ कनेक्शन के साथ वेब सर्वर / डेटाबेस / आदि को क्रश नहीं करना चाहता। यह एक थ्रेड या प्रोसेस पूल के साथ उल्लेखनीय है, लेकिन क्या ऐसा करने का कोई तरीका है asyncio
?
2020 अपडेट (पायथन 3.7+) : इन स्निपेट्स का उपयोग न करें। इसके बजाय उपयोग करें:
import asyncio
async def do_something_async():
tasks = []
for i in range(5):
tasks.append(asyncio.create_task(foo(i)))
await asyncio.gather(*tasks)
def do_something():
asyncio.run(do_something_async)
तीनों का उपयोग करने पर भी विचार करें , एसिंसीओ के लिए एक मजबूत 3 पार्टी विकल्प।
ensure_future()
? और अगर मुझे परिणाम की आवश्यकता है, तो क्या मैं अभी उपयोग नहीं कर सकता हूंrun_until_complete(gather(coros))
?