ধরা যাক আমাদের একটি ডামি ফাংশন রয়েছে:
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
?
অতিরিক্ত creditণের জন্য, যদি আমি কলগুলি ব্যাচ করতে চাই? উদাহরণস্বরূপ, আমাকে 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)
এছাড়াও ব্যবহারের বিষয়ে বিবেচনা ট্রিও , asyncio করার জন্য একটি শক্তসমর্থ 3rd পার্টি বিকল্প।
ensure_future()
? এবং যদি আমার ফলাফলের প্রয়োজন হয়, আমি কি কেবল ব্যবহার করতে পারি নাrun_until_complete(gather(coros))
?