async در پایتون بدنام شده چون بیشتر آموزش‌ها همان await asyncio.sleep(1) را تکرار می‌کنند. قدرت واقعی وقتی است که ده‌ها کار I/O آهسته را همزمان هماهنگ کنی.

۱. همزمانی محدود (Bounded concurrency)

هزار task را کورکورانه اجرا نکن. یک semaphore جمعیت را کنترل می‌کند:

python
import asyncio, aiohttp

sem = asyncio.Semaphore(20)

async def fetch(url: str) -> str:
    async with sem:
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as resp:
                return await resp.text()

۲. تایم‌اوت اجباری است

python
try:
    result = await asyncio.wait_for(fetch(url), timeout=5)
except asyncio.TimeoutError:
    result = "timeout"

۳. asyncio.gather با return_exceptions

python
results = await asyncio.gather(*tasks, return_exceptions=True)

۴. از کد بلاک‌کننده بپرهیز

یک time.sleep() ساده داخل task، کل event loop را متوقف می‌کند. برای کارهای CPU-heavy از asyncio.to_thread استفاده کن.

۵. خاموش‌شدن مرتب

python
async def main():
    tasks = [consume(queue) for _ in range(10)]
    await queue.join()
    for t in tasks:
        t.cancel()
    await asyncio.gather(*tasks, return_exceptions=True)

قانون طلایی: async یعنی خوب منتظر ماندن، نه سریع حساب کردن. کار CPU را بیرون حلقه نگه دار تا خروجی‌ات غافلگیرت کند.