TaskGroup
یکی از ویژگیهای جدید در ماژول asyncio
است که به شما اجازه میدهد تا مجموعهای از coroutineها را به صورت همزمان اجرا کنید و به راحتی خطاها و استثناهای آنها را مدیریت کنید. TaskGroup
در پایتون 3.11 معرفی شده است و در مقایسه با asyncio.gather
، مدیریت بهتری برای استثناها و کارهای همزمان فراهم میکند.
ویژگیهای TaskGroup
- مدیریت همزمانی:
TaskGroup
به شما اجازه میدهد چندین coroutine را همزمان اجرا کنید و منتظر بمانید تا همه آنها به پایان برسند. - مدیریت خودکار استثناها: اگر یکی از 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())
توضیحات
-
تعریف coroutineها:
task1
وtask3
: هر دو coroutineها با موفقیت اجرا میشوند و پیغامهای مربوطه را چاپ میکنند.task2
: این coroutine دچار خطا میشود و استثنایی را تولید میکند.
-
استفاده از
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
ایجاد میکند.
- با استفاده از
-
مدیریت استثنا:
- اگر هر کدام از coroutineها دچار استثنا شوند،
TaskGroup
بهطور خودکار همه taskها را لغو میکند و استثنا را به بالا منتقل میکند. این استثنا در بلوکtry
مدیریت میشود و پیام خطا چاپ میشود.
- اگر هر کدام از coroutineها دچار استثنا شوند،
تفاوت TaskGroup
با asyncio.gather
-
مدیریت استثنا:
TaskGroup
: اگر یکی از taskها دچار استثنا شود، بلافاصله همه taskها لغو میشوند و استثنا به بالا منتقل میشود.asyncio.gather
: اگر یکی از taskها دچار استثنا شود، بهطور پیشفرض همه taskها ادامه میدهند، و فقط استثنا به بالاترین سطح منتقل میشود (مگر اینکه ازreturn_exceptions=True
استفاده شود).
-
سینتکس:
TaskGroup
به یک ساختار بلوکی (context manager) نیاز دارد، که کد را به صورت خواناتر و سازمانیافتهتر میکند.asyncio.gather
به سادگی یک لیست از coroutineها را به عنوان ورودی میپذیرد.
TaskGroup
یک ابزار قدرتمند و مفید برای مدیریت همزمانی و استثناها در asyncio
است که به شما این امکان را میدهد تا بهراحتی coroutineها را اجرا کنید و در عین حال خطاها را بهطور مؤثری مدیریت کنید. با استفاده از TaskGroup
، میتوانید برنامههای غیرهمزمان پیچیدهتری بنویسید که بهطور مؤثری با شرایط خطا روبرو میشوند.