فصل پنجم: برنامه‌نویسی ناهم‌گام با asyncio

ایجاد Task و مدیریت خطا در asyncio

اجرای پس‌زمینه با Task

گاهی می‌خواهیم یک coroutine بلافاصله شروع به اجرا کند و منتظر پایان آن نمانیم، بلکه بعداً نتیجه‌اش را بگیریم. برای این منظور از asyncio.create_task() استفاده می‌شود که coroutine را به یک Task در پس‌زمینه تبدیل می‌کند.

import asyncio

async def background_job():
    await asyncio.sleep(2)
    print("کار پس‌زمینه تمام شد")

async def main():
    task = asyncio.create_task(background_job())
    print("در حال انجام کارهای دیگر...")
    await asyncio.sleep(1)
    print("هنوز منتظر task هستیم")
    await task

asyncio.run(main())

برای مدیریت خطا در coroutine‌ها، از همان بلوک آشنای try/except استفاده می‌شود، اما باید دقت کنید که خطای یک Task تا زمانی که آن را await نکنید ممکن است بی‌سروصدا نادیده گرفته شود:

async def risky():
    raise ValueError("خطای عمدی")

async def main():
    task = asyncio.create_task(risky())
    try:
        await task
    except ValueError as e:
        print(f"خطا مدیریت شد: {e}")

در پروژه‌های واقعی، asyncio معمولاً همراه کتابخانه‌هایی مانند aiohttp برای درخواست‌های شبکه یا فریمورک‌های ناهم‌گام مانند FastAPI استفاده می‌شود، جایی که مدیریت درست خطا و timeout اهمیت زیادی در پایداری سرویس دارد.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.