اگر اخیراً با زبان‌های برنامه‌نویسی کار کرده باشید، حتماً سوال براتون پیش اومده که async و await چیست؟ این دو کلمه به شما کمک می‌کنند تا کدهای غیرهمزمان (asynchronous) بنویسید. شاید اولش به نظرتون پیچیده بیاد، ولی در واقع این مفاهیم کارتون رو راحت‌تر و عملکرد برنامه‌هاتون رو بهینه‌تر می‌کنن. در این مقاله به زبون ساده می‌خوایم ببینیم async و await چطور کار می‌کنن و چه کاربردهایی دارن.

برنامه‌نویسی همزمان و غیرهمزمان

قبل از اینکه بریم سراغ async و await، باید تفاوت بین برنامه‌نویسی همزمان (synchronous) و غیرهمزمان (asynchronous) رو بفهمیم. توی برنامه‌نویسی همزمان، کدها به ترتیب اجرا می‌شن؛ یعنی هر خط کد منتظر می‌مونه تا خط قبلی تموم بشه و بعد خودش اجرا بشه. این یعنی اگه یه خط کد زمان زیادی ببره، بقیه کدها باید منتظر بمونن.

اما توی برنامه‌نویسی غیرهمزمان، کدها می‌تونن بدون منتظر موندن اجرا بشن. این یعنی وقتی شما یک تسک طولانی دارید (مثل درخواست به یک سرور)، بقیه کدها همچنان به اجرای خودشون ادامه می‌دن و نیازی نیست منتظر اون تسک بمونن. اینجاست که async و await به کار میان.

async چیه؟

async کلمه کلیدی‌ایه که وقتی به یک تابع اضافه بشه، اون تابع رو تبدیل به یه تابع غیرهمزمان (asynchronous) می‌کنه. وقتی شما یه تابع رو async می‌کنید، یعنی این تابع می‌تونه به صورت غیرهمزمان اجرا بشه و از تسک‌های طولانی بدون مسدود کردن بقیه کدها پشتیبانی کنه.

مثلاً فرض کنید یه تابع دارید که می‌خواد داده‌ای رو از یک API بگیره:

async def fetch_data():
response = await some_api_call()
return response

وقتی تابعی رو با async تعریف می‌کنید، اون تابع می‌تونه از await استفاده کنه. و این ما رو به قسمت بعدی می‌رسونه: await!

await چیه؟

وقتی شما توی یک تابع async، از await استفاده می‌کنید، دارید به برنامه می‌گید که این تسک ممکنه طول بکشه و نیازی نیست که برنامه منتظر بمونه تا تموم بشه. در واقع با استفاده از await، کد می‌تونه بقیه کارهاش رو ادامه بده، تا وقتی که نتیجه تسک آماده بشه.

مثلاً توی کد بالا، ما منتظریم که نتیجه درخواست API برگرده. به جای اینکه کل برنامه متوقف بشه، بقیه کارها انجام می‌شن و وقتی که نتیجه API آماده شد، اون تابع به کار خودش ادامه می‌ده.

آموزش پایتون از صفر (رایگان)

کاربردهای async و await

async و await به درد جایی می‌خورن که بخوایم عملیات‌های زمان‌بر (مثل درخواست‌های شبکه، خواندن و نوشتن فایل، یا عملیات‌های I/O) رو بدون مسدود کردن بقیه برنامه اجرا کنیم. این باعث می‌شه که برنامه‌ها سریع‌تر و روان‌تر اجرا بشن، مخصوصاً وقتی داریم با تعداد زیادی درخواست و کارهای همزمان سروکار داریم.

یه مثال دیگه از کاربرد async و await توی پایتون، کتابخونه‌هایی مثل aiohttp یا asyncio هست که برای مدیریت درخواست‌های غیرهمزمان به کار می‌رن. مثلاً با استفاده از aiohttp، می‌تونید همزمان چندین درخواست به API‌های مختلف بفرستید بدون اینکه سرعت برنامه پایین بیاد.

async و await در مقابل Threading

یکی از سوال‌هایی که ممکنه پیش بیاد اینه که async و await چه تفاوتی با Threading دارن؟ توی Threading هم می‌تونیم چندین تسک رو همزمان اجرا کنیم. اما async و await خیلی سبک‌تر از Threading هستن و برای تسک‌های I/O که منتظر یک پاسخ خارجی هستن (مثل درخواست‌های شبکه یا خواندن فایل) مناسب‌ترن. این تکنیک‌ها باعث می‌شن که مدیریت منابع سیستم بهتر انجام بشه و در نهایت کارایی بالاتری داشته باشیم.

جمع‌بندی

async و await ابزارهایی هستند که به شما کمک می‌کنن کدهای غیرهمزمان بنویسید و عملکرد برنامه‌تون رو بهبود بدید. با async می‌تونید توابعی بسازید که تسک‌های زمان‌بر رو بدون مسدود کردن بقیه کدها اجرا می‌کنن، و با await هم می‌تونید منتظر اجرای این تسک‌ها بمونید بدون اینکه برنامه قفل بشه. با یادگیری async و await، می‌تونید کدهای پیشرفته‌تری بنویسید و برنامه‌هاتون رو بهینه‌تر کنید.

امیدواریم تو این مقاله از کدیتی به سوال همیشگی برنامه نویس ها یعنی async و await چیست؟ به خوبی جواب داده باشیم 😊