Python'da Asenkron Programlamaya Giriş: asyncio Temelleri
I/O yoğun Python uygulamalarında performansı artırmak için asyncio'nun temel kavramlarını örneklerle anlatıyorum.
Python'da Asenkron Programlamaya Giriş: asyncio Temelleri
Python'da asyncio, I/O yoğun işlemlerde (ağ istekleri, dosya okuma, veritabanı sorguları) tek thread üzerinde eşzamanlılık sağlamak için kullanılan güçlü bir araç. Ancak doğru anlaşılmadığında beklenmedik performans sorunlarına yol açabiliyor.
Coroutine ve Event Loop
async def ile tanımlanan bir fonksiyon, çağrıldığında hemen çalışmaz; bir coroutine nesnesi döner. Bu coroutine'in gerçekten çalışması için event loop tarafından zamanlanması gerekir.
async def fetch_data():
await asyncio.sleep(1)
return "veri"
async def main():
result = await fetch_data()
print(result)
asyncio.run(main())
await'in Gerçekten Ne Yaptığı
await, mevcut coroutine'in kontrolü event loop'a bırakmasını sağlar. Bu sırada event loop, bekleyen başka görevleri çalıştırabilir. Bu yüzden asyncio, CPU yoğun işlerde değil, bekleme süresi olan I/O işlemlerinde fayda sağlıyor.
asyncio.gather ile Paralel Çalıştırma
results = await asyncio.gather(
fetch_data(url1),
fetch_data(url2),
fetch_data(url3),
)
Bu üç istek sırayla değil, eşzamanlı olarak beklemeye alınır. Sıralı çalıştırmaya göre toplam süre, en yavaş isteğin süresine yakın olur.
Yaygın Tuzak: CPU Yoğun İşlemleri asyncio ile Karıştırmak
asyncio tek thread üzerinde çalıştığı için, CPU yoğun bir hesaplama event loop'u bloke eder ve diğer tüm coroutine'lerin çalışmasını durdurur. Bu tür işler için multiprocessing veya thread pool executor kullanmak gerekir.
Sonuç
asyncio, doğru senaryoda (ağ istekleri, veritabanı I/O) kullanıldığında ciddi performans kazanımları sağlıyor. Yanlış senaryoda (CPU yoğun hesaplama) ise fayda sağlamıyor, hatta karmaşıklığı artırabiliyor.