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 را بیرون حلقه نگه دار تا خروجیات غافلگیرت کند.