آموزش async و await در پایتون؛ اجرای همزمان بدون دردسر!
فهرست مطالب این نوشته
Toggleدر پروژههایی مثل سرورهای وب یا رباتهای تلگرام که تعداد درخواستها و پردازشها زیاد است، توسعهدهندگان همیشه بهدنبال راهی برای افزایش سرعت پاسخدهی هستند. همین نیاز باعث شد مفهوم async و await در پایتون به وجود بیاید تا بتوانیم چند کار را بهصورت همزمان، اما در یک مسیر اجرایی انجام دهیم و این قابلیت بهویژه در پروژههایی که نیاز به پردازش همزمان دارند، کاربردی است و میتواند به یادگیرندگان در آموزش اسکرچ جونیور و آموزش پایتون مقدماتی کمک کند تا مفاهیم برنامهنویسی ناهمگام را بهصورت عملی و مرحلهبهمرحله درک کنند.
در ادامه نحوه استفاده از async await در پایتون را آموزش میدهیم و کاربردهای اصلی آن را در پروژهها بررسی میکنیم.
تخفیفهای شگفتانگیز جشنواره آکادمی چابک
تخفیف بگیر و ثبت نام کن!
مفهوم async await در پایتون چیست؟
Async در پایتون یعنی اجرای چند کار بهصورت همزمان، بدون اینکه جریان اصلی برنامه متوقف شود. برخلاف مدل سنتی که هر تابع تا پایان اجرای خود بقیه را معطل میکرد، در مدل ناهمگام، توابع میتوانند “منتظر” نتیجه بمانند اما در همین حین بقیه کارها اجرا شوند.
تفاوت Async با Threading و Multiprocessing
در کنار Async، مدلهای دیگری هم برای اجرای همزمان وظایف وجود دارد که هرکدام بسته به نوع پروژه عملکرد متفاوتی دارند. این مدلها هرچند در ظاهر مشابهاند، اما تفاوتهای آشکاری با هم دارند که بهتر است با آنها آشنا شوید:
| مدل | ویژگی | کاربرد اصلی |
|---|---|---|
| Threading | اجرای همزمان چند Thread در یک پردازش | کارهای I/O مثل درخواست وب |
| Multiprocessing | استفاده از چند هسته CPU | کارهای CPU-bound مثل تحلیل داده |
| Async (async و await در پایتون) | اجرای غیرمسدودکننده در یک Thread | عملیات شبکه، فایل یا دیتابیس |
اجزای اصلی async و await در پایتون
ماژول استاندارد پایتون برای برنامهنویسی ناهمگام، asyncio است. با این ماژول میتوان توابعی ساخت که همزمان اجرا شوند. عناصر این ماژول شامل:
- async def: تعریف تابع ناهمگام (Coroutine Function)
- await: توقف موقت تابع تا اتمام نتیجه و آزاد شدن Event Loop
- Event Loop: مغز مرکزی اجرای توابع ناهمگام
- asyncio.run(): شروع اجرای حلقه رویداد
- asyncio.gather(): اجرای چند Coroutine همزمان
یک مثال از این اجزا برایتان آوردهایم تا بتوانید راحتتر درکشان کنید:
import asyncio
async def greet():
print(“سلام!”)
await asyncio.sleep(1)
print(“به دنیای async و await در پایتون خوش آمدید!”)
asyncio.run(greet())
در این مثال، اجرای تابع بین دو خط چاپ متوقف میشود اما برنامه قفل نمیکند؛ یعنی میتواند همزمان کارهای دیگری انجام دهد.
همین حالا ثبتنام کنید!
در آموزش async await در پایتون از چه ماژولهایی باید استفاده کنیم؟
در دورههای حرفهای آموزش async await در پایتون، با ابزارهایی آشنا میشوید که کار با عملیات همزمان را سادهتر میکنند. این ماژولها مزیت مهمی دارند: میتوانند سرعت اجرای برنامه را بالا ببرند بدون اینکه منابع سیستم را بیهوده درگیر کنند و همین ویژگی باعث شده این دورهها برای علاقهمندان به آموزش پایتون برای بازیسازها و کسانی که با کاربرد اسکرچ جونیور شروع به یادگیری برنامهنویسی میکنند، بسیار مفید و کاربردی باشد.
برای همین بهتر است ماژولهای زیر را بشناسید:
| ماژول | کاربرد |
|---|---|
| asyncio | پایه و اساس برنامهنویسی ناهمگام در پایتون |
| aiohttp | ارسال و دریافت درخواستهای HTTP بهصورت Async |
| aiosqlite / aiomysql | اتصال ناهمگام به دیتابیسها |
| aiofiles | خواندن و نوشتن فایلها به شکل غیرمسدودکننده |
مثلاً برای دانلود چند صفحه وب همزمان:
import aiohttp, asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = [“https://example.com”, “https://python.org”]
results = await asyncio.gather(*(fetch(u) for u in urls))
print(len(results))
asyncio.run(main())

کاربرد async و await در پایتون
آموزش جامع Async در Python زمانی ارزشمند است که بتوان آن را در پروژههای واقعی به کار گرفت. پروژههایی مثل:
- رباتهای تلگرام: برای پاسخگویی همزمان به چند کاربر
- APIهای وب با FastAPI یا Sanic: برای مدیریت درخواستهای زیاد
- برنامههای جمعآوری داده (Web Scraping): برای دریافت سریع داده از صدها URL
- مدیریت فایلهای زیاد در سرور: بدون قفل شدن فرآیند اصلی
آیا مفهوم async await در پایتون برای ساخت ربات تلگرام هم کاربرد دارد؟
همانطور که پیشتر هم اشاره شد، یکی از کاربردهای رایج این قابلیت، ساخت برنامههایی است که باید همزمان با تعداد زیادی کاربر تعامل داشته باشند.
در ساخت ربات تلگرام با کتابخانههایی مثل aiogram، میتوان از async و await در پایتون برای مدیریت پیامها، درخواستها و پاسخها استفاده کرد تا ربات بتواند با هزاران کاربر بهصورت همزمان و بدون کندی کار کند.
نمونه:
from aiogram import Bot, Dispatcher, types
import asyncio
async def main():
bot = Bot(“TOKEN”)
dp = Dispatcher()
@dp.message()
async def handle_message(msg: types.Message):
await msg.answer(“سلام! من با async و await در پایتون نوشته شدم.”)
await dp.start_polling(bot)
asyncio.run(main())
چطور در async await در پایتون خطاهای همزمانی را مدیریت کنیم؟
وقتی چندین Coroutine همزمان اجرا میشوند، اغلب یکی دو مورد از آنها خطا میدهند. برای جلوگیری از توقف کل برنامه باید خطاها را بهدرستی مدیریت کنیم و یادگیری نحوه مدیریت این خطاها بخش مهمی از آموزش دادهکاوی با پایتون است تا برنامهها پایدار و قابل اطمینان باقی بمانند.
روشهای پیشنهادی:
- استفاده از try/except داخل هر Coroutine
- استفاده از asyncio.wait() با timeout
- کنترل دقیق با asyncio.Lock برای جلوگیری از تداخل دسترسیها
در پایتون ۳.۱۱ به بعد، میتوان از ExceptionGroup استفاده کرد:
try:
await asyncio.gather(task1(), task2())
except* ValueError as e:
print(“خطای مقدار:”, e)
بهترین روشها در استفاده از async و await در پایتون
گاهی در پروژههای برنامهنویسی، دانستن چند نکتهی ساده میتواند عملکرد برنامه را چندین برابر بهبود دهد. نکاتی مثل:
- همیشه از asyncio.run() برای شروع برنامه استفاده کنید.
- برای وظایف زیاد، asyncio.gather() بهتر از حلقههای ساده است.
- در کارهای CPU-bound از async استفاده نکنید (بهتر است multiprocessing باشد).
- از context managerهای ناهمگام مثل async with برای مدیریت منابع استفاده کنید.
چه زمانی از Async استفاده نکنیم؟
async و await در پایتون برای پروژههایی که شامل کارهای شبکه، درخواستهای HTTP یا تعاملات دیتابیس هستند بهترین گزینهاند. اما اگر پروژه شامل محاسبات سنگین، پردازش تصویر، یادگیری ماشین یا تحلیل دادههای حجیم باشد، بهتر است از مدل چندپردازشی (multiprocessing) استفاده کنید، چون async در چنین پروژههایی نمیتواند از چند هسته CPU بهطور کامل استفاده کند.
Async و Await در پایتون امکان اجرای همزمان وظایف را بدون قفل شدن برنامه فراهم میکند و توسعهدهندگان میتوانند عملکرد سرورها و رباتها را بهطور قابلتوجهی بهینه کنند.
جمعبندی
بنابراین دیدیم که async و await در پایتون راهکارهایی هستند برای اجرای همزمان وظایف بدون قفل شدن برنامه. بیشتر توسعهدهندگان از آن برای بهینهسازی عملکرد سرورها، APIها و رباتهای تلگرام استفاده میکنند، اما در پروژههای دیگر مثل پایپلاینهای داده و برنامههای وب بلادرنگ هم کاربرد دارند و آموزشهای عملی این مفاهیم در آکادمی چابک ارائه میشود.
اگر میخواهید در زمینههایی مثل برنامهنویسی ناهمگام، توسعه سرورهای FastAPI و طراحی سیستمهای همزمان در پایتون دانش بیشتری پیدا کنید و تخصص خود را گسترش دهید، میتوانید در دورههای تخصصی آکادمی چابک شرکت کنید. برای اطلاع از جدیدترین دورهها و تخفیفهای ویژه، همین حالا به صفحه محصولات ما سر بزنید.
منبع:


دیدگاهتان را بنویسید