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، میتوانید برنامههای غیرهمزمان پیچیدهتری بنویسید که بهطور مؤثری با شرایط خطا روبرو میشوند.