asyncio.gather
یکی از توابع کلیدی در کتابخانه asyncio
پایتون است که برای اجرای همزمان چندین coroutine استفاده میشود. این تابع به شما اجازه میدهد تا چندین وظیفه (task) یا coroutine را به طور همزمان اجرا کنید و منتظر بمانید تا همه آنها به پایان برسند.
نحوه استفاده از asyncio.gather
تابع asyncio.gather
یک یا چند coroutine را به عنوان ورودی میپذیرد و یک coroutine جدید ایجاد میکند که زمانی که تمام coroutineهای ورودی کامل شدند، تکمیل میشود. این تابع نتایج همه coroutineها را به صورت یک لیست باز میگرداند.
مثال ساده
در اینجا یک مثال ساده از نحوه استفاده از asyncio.gather
آورده شده است:
import asyncio
async def task1():
await asyncio.sleep(1)
return "Task 1 completed"
async def task2():
await asyncio.sleep(2)
return "Task 2 completed"
async def task3():
await asyncio.sleep(3)
return "Task 3 completed"
async def main():
results = await asyncio.gather(task1(), task2(), task3())
print(results)
asyncio.run(main())
توضیحات
-
تعریف coroutineها:
task1
: این coroutine به مدت 1 ثانیه متوقف میشود و سپس پیامی را باز میگرداند.task2
: این coroutine به مدت 2 ثانیه متوقف میشود و سپس پیامی را باز میگرداند.task3
: این coroutine به مدت 3 ثانیه متوقف میشود و سپس پیامی را باز میگرداند.
-
استفاده از
asyncio.gather
در تابعmain
:results = await asyncio.gather(task1(), task2(), task3())
: این خط coroutineهایtask1
،task2
وtask3
را به صورت همزمان اجرا میکند و منتظر میماند تا همه آنها به پایان برسند. نتایج هر coroutine در لیستresults
ذخیره میشود.print(results)
: نتایج بازگشتی از همه coroutineها را چاپ میکند.
مدیریت استثناها با asyncio.gather
در صورتی که یکی از coroutineها دچار استثنا شود، به طور پیشفرض asyncio.gather
استثنا را به بالا منتقل میکند و اجرای سایر coroutineها متوقف نمیشود. برای مدیریت بهتر استثناها، میتوانید از پارامتر return_exceptions
استفاده کنید.
مثال مدیریت استثناها
import asyncio
async def task1():
await asyncio.sleep(1)
return "Task 1 completed"
async def task2():
await asyncio.sleep(2)
raise Exception("Task 2 failed")
async def task3():
await asyncio.sleep(3)
return "Task 3 completed"
async def main():
results = await asyncio.gather(task1(), task2(), task3(), return_exceptions=True)
for result in results:
if isinstance(result, Exception):
print(f"Exception: {result}")
else:
print(result)
asyncio.run(main())
توضیحات
return_exceptions=True
: با تنظیم این پارامتر بهTrue
،asyncio.gather
استثناهای رخ داده در coroutineها را به جای متوقف کردن، به عنوان نتایج باز میگرداند.- در بلوک
for
، اگر نتیجه یک استثنا باشد، آن را چاپ میکند وگرنه نتیجه معمولی coroutine را چاپ میکند.
asyncio.gather
ابزاری قدرتمند برای اجرای همزمان چندین coroutine و جمعآوری نتایج آنها است. با استفاده از این تابع، میتوانید به راحتی وظایف غیرهمزمان را مدیریت کرده و از اجرای همزمان آنها بهره ببرید. علاوه بر این، با استفاده از پارامتر return_exceptions
میتوانید به طور مؤثرتری استثناها را مدیریت کنید.