اجرای پسزمینه با 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 اهمیت زیادی در پایداری سرویس دارد.