استفاده از TaskGroup

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

TaskGroup یکی از ویژگی‌های جدید در ماژول asyncio است که به شما اجازه می‌دهد تا مجموعه‌ای از coroutine‌ها را به صورت همزمان اجرا کنید و به راحتی خطاها و استثناهای آن‌ها را مدیریت کنید. TaskGroup در پایتون 3.11 معرفی شده است و در مقایسه با asyncio.gather، مدیریت بهتری برای استثناها و کارهای همزمان فراهم می‌کند.

ویژگی‌های TaskGroup

  1. مدیریت همزمانی: TaskGroup به شما اجازه می‌دهد چندین coroutine را همزمان اجرا کنید و منتظر بمانید تا همه آن‌ها به پایان برسند.
  2. مدیریت خودکار استثناها: اگر یکی از coroutine‌ها دچار استثنا شود، TaskGroup به‌طور خودکار همه task‌ها را لغو می‌کند و استثنا را به بالا منتقل می‌کند. این به شما امکان می‌دهد تا به راحتی خطاها را مدیریت کنید.

نحوه استفاده از TaskGroup

برای استفاده از TaskGroup، می‌توانید از asyncio.TaskGroup در یک بلوک async with استفاده کنید. در زیر یک مثال از نحوه استفاده از TaskGroup آورده شده است:

import asyncio

async def task1():
    await asyncio.sleep(1)
    print("Task 1 completed")
    return "Result from Task 1"

async def task2():
    await asyncio.sleep(2)
    print("Task 2 completed")
    raise Exception("Error in Task 2")  # این task دچار خطا می‌شود

async def task3():
    await asyncio.sleep(1)
    print("Task 3 completed")
    return "Result from Task 3"

async def main():
    try:
        async with asyncio.TaskGroup() as tg:
            tg.create_task(task1())
            tg.create_task(task2())  # این task دچار خطا می‌شود
            tg.create_task(task3())
    except Exception as e:
        print(f"Caught an exception: {e}")

asyncio.run(main())

توضیحات

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

    • task1 و task3: هر دو coroutine‌ها با موفقیت اجرا می‌شوند و پیغام‌های مربوطه را چاپ می‌کنند.
    • task2: این coroutine دچار خطا می‌شود و استثنایی را تولید می‌کند.
  2. استفاده از TaskGroup:

    • با استفاده از async with asyncio.TaskGroup() as tg، یک گروه task جدید ایجاد می‌شود.
    • tg.create_task(task1()): یک task برای task1 ایجاد می‌کند.
    • tg.create_task(task2()): یک task برای task2 ایجاد می‌کند که دچار خطا می‌شود.
    • tg.create_task(task3()): یک task برای task3 ایجاد می‌کند.
  3. مدیریت استثنا:

    • اگر هر کدام از coroutine‌ها دچار استثنا شوند، TaskGroup به‌طور خودکار همه task‌ها را لغو می‌کند و استثنا را به بالا منتقل می‌کند. این استثنا در بلوک try مدیریت می‌شود و پیام خطا چاپ می‌شود.

تفاوت TaskGroup با asyncio.gather

  • مدیریت استثنا:

    • TaskGroup: اگر یکی از task‌ها دچار استثنا شود، بلافاصله همه task‌ها لغو می‌شوند و استثنا به بالا منتقل می‌شود.
    • asyncio.gather: اگر یکی از task‌ها دچار استثنا شود، به‌طور پیش‌فرض همه task‌ها ادامه می‌دهند، و فقط استثنا به بالاترین سطح منتقل می‌شود (مگر اینکه از return_exceptions=True استفاده شود).
  • سینتکس:

    • TaskGroup به یک ساختار بلوکی (context manager) نیاز دارد، که کد را به صورت خواناتر و سازمان‌یافته‌تر می‌کند.
    • asyncio.gather به سادگی یک لیست از coroutine‌ها را به عنوان ورودی می‌پذیرد.

TaskGroup یک ابزار قدرتمند و مفید برای مدیریت همزمانی و استثناها در asyncio است که به شما این امکان را می‌دهد تا به‌راحتی coroutine‌ها را اجرا کنید و در عین حال خطاها را به‌طور مؤثری مدیریت کنید. با استفاده از TaskGroup، می‌توانید برنامه‌های غیرهمزمان پیچیده‌تری بنویسید که به‌طور مؤثری با شرایط خطا روبرو می‌شوند.


ثبت دیدگاه


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

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


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