اجرای چندین وظیفه با gather

  • مدرس: علی بیگدلی
  • تاریخ انتشار: 1403/05/11
  • تعداد بازدید: 52

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())

توضیحات

  1. تعریف coroutine‌ها:

    • task1: این coroutine به مدت 1 ثانیه متوقف می‌شود و سپس پیامی را باز می‌گرداند.
    • task2: این coroutine به مدت 2 ثانیه متوقف می‌شود و سپس پیامی را باز می‌گرداند.
    • task3: این coroutine به مدت 3 ثانیه متوقف می‌شود و سپس پیامی را باز می‌گرداند.
  2. استفاده از 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 می‌توانید به طور مؤثرتری استثناها را مدیریت کنید.


ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است می توانید اولین نفر باشید