async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?
Cevap
asyncio, tek thread üzerinde çalışan bir event loop ile eşzamanlılık (concurrency) sağlar. async def ile tanımlanan fonksiyon çağrıldığında hemen çalışmaz, bir coroutine nesnesi döner. await, coroutine'i I/O beklerken askıya alır ve kontrolü event loop'a bırakır; loop bu sürede başka görevleri çalıştırır.
import asyncio
import httpx
async def getir(client, url):
r = await client.get(url)
return r.status_code
async def main():
urls = [f"https://api.example.com/items/{i}" for i in range(100)]
async with httpx.AsyncClient() as client:
sonuclar = await asyncio.gather(*(getir(client, u) for u in urls))
print(sonuclar)
asyncio.run(main())100 istek sırayla değil, eşzamanlı bekletilir; toplam süre yaklaşık en yavaş isteğin süresi kadar olur.
Temel kavramlar
asyncio.create_task(coro): coroutine'i arka planda zamanlar.asyncio.gather/TaskGroup(3.11+): birden çok görevi birlikte bekler.asyncio.Semaphore: aynı anda çalışan görev sayısını sınırlar.asyncio.wait_for(coro, timeout=5): zaman aşımı ekler.
En sık hata: event loop'u bloklamak
async fonksiyon içinde time.sleep(), requests.get() veya ağır CPU hesabı yapılırsa tüm loop durur. Çözüm: await asyncio.sleep(), async kütüphaneler (httpx, asyncpg) ya da bloklayan kodu await asyncio.to_thread(fonk) ile thread'e taşımak.
Hangisini seçmeli?
| İş yükü | Tercih |
|---|---|
| Çok sayıda ağ/DB beklemesi (I/O-bound) | asyncio |
| I/O-bound ama kütüphane senkron | threading |
| CPU-bound (hesaplama, görüntü işleme) | multiprocessing |
asyncio paralellik değil eşzamanlılık sağlar; GIL nedeniyle CPU-bound işi hızlandırmaz.
İlgili Python soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.