مشکل انتظار در برنامههای I/O-محور
در بسیاری از برنامهها، بخش زیادی از زمان اجرا صرف انتظار برای پاسخ شبکه، خواندن فایل یا پاسخ پایگاه داده میشود، نه پردازش واقعی پردازنده. در برنامهنویسی معمولی (synchronous)، در طول این انتظار کل برنامه متوقف میماند. برنامهنویسی ناهمگام (asynchronous) به برنامه اجازه میدهد در زمان انتظار، به کارهای دیگر بپردازد.
پایتون این قابلیت را از طریق ماژول asyncio و کلیدواژههای async و await فراهم میکند. یک تابع coroutine با async def تعریف میشود و میتواند در نقاطی با await اجرای خود را موقتاً به نفع coroutine دیگر متوقف کند.
import asyncio
async def say_hello():
print("شروع")
await asyncio.sleep(1)
print("پایان")
asyncio.run(say_hello())نکتهی مهم این است که asyncio برای کارهای I/O-محور مانند درخواست شبکه یا دسترسی به فایل مناسب است، نه برای محاسبات سنگین پردازندهمحور؛ برای آن نوع کارها باید به سراغ multiprocessing رفت. تمایز درست بین این دو نوع مسئله، اولین قدم برای استفادهی درست از asyncio است.