Python Asyncio ile Hızlanın: Modern Eşzamanlılık ve TaskGroup

Bir e-ticaret sitesine girdiğinizde, ürün sayfasının yüklenmesi için arka planda onlarca farklı işlem gerçekleşir: Ürün bilgileri çekilir, stok durumu kontrol edilir, kullanıcı yorumları getirilir ve kargo ücretleri hesaplanır. Eğer bu işlemler sırayla yapılsaydı, sayfanın açılması saniyeler sürer ve kullanıcılar sitenizi terk ederdi. Peki, Python ile tüm bu işlemleri aynı anda, birbirini beklemeden nasıl yapabiliriz?

E-Ticaret Veri Toplayıcı: Asenkron Programlama Nedir?

Bu projede, gerçek hayattaki bir “API Toplayıcı (Aggregator)” senaryosunu simüle ediyoruz. Amacımız; ürün detayları, stok durumu ve müşteri yorumları gibi üç farklı veri kaynağına aynı anda istek atmak ve hepsini tek bir sonuç paketinde birleştirmek.

Geleneksel (senkron) programlamada, bir işlem bitmeden diğeri başlamaz. Ancak asyncio kütüphanesi sayesinde, programımız bir I/O işlemi (örneğin bir ağ isteği veya veritabanı sorgusu) sırasında “beklemek” yerine, o sırada yapılabilecek başka bir işe geçer. Bu durum, özellikle ağ gecikmelerinin yüksek olduğu sistemlerde muazzam bir performans artışı sağlar.

Kodun Anatomisi

Projenin kalbinde Python’ın modern async/await sözdizimi ve Python 3.11 ile gelen asyncio.TaskGroup yapısı yer alıyor.

Coroutine’ler ve await

Kodda async def ile tanımlanan fonksiyonlar standart fonksiyonlar değil, coroutine‘lerdir. Bu fonksiyonlar çağrıldığında hemen çalışmazlar; bunun yerine bir “coroutine nesnesi” dönerler. await anahtar kelimesi ise, “bu işlem bitene kadar kontrolü event loop’a (olay döngüsü) geri ver, işlem bittiğinde buradan devam et” anlamına gelir.

Yapılandırılmış Eşzamanlılık: TaskGroup

Python 3.11 öncesinde asyncio.gather sıkça kullanılıyordu. Ancak TaskGroup, daha güvenli bir “yapılandırılmış eşzamanlılık (structured concurrency)” sunar. Eğer gruptaki görevlerden biri hata alırsa, TaskGroup diğer tüm görevleri otomatik olarak iptal eder, böylece sistemde “yetim” görevler kalmaz.

https://gist.github.com/ahmetax/88b1a9b5995b1194cdc1bdb933f4b485

(Kodlar için yukarıdaki gist linkine tıklayın!)

Nasıl Çalıştırılır?

Bu projenin çalışması için Python 3.11 veya üzeri bir sürüme ihtiyacınız vardır (TaskGroup özelliği 3.11 ile gelmiştir).

  1. Proje klasörüne gidin.
  2. Aşağıdaki komutla kodu çalıştırın:
   python main.py

Dikkat Çekici Nokta: Toplam çalışma süresine baktığınızda, 1.5s + 1.0s + 2.0s = 4.5 saniye yerine, sadece en yavaş görev olan 2.0 saniye civarında bir süre göreceksiniz. İşte asenkron programlamanın gücü budur!

Ne Öğrendik?

  • Non-blocking I/O: Programın ağ veya disk beklerken donmaması, başka işler yapabilmesi.
  • Async/Await: Asenkron fonksiyon tanımlama ve yönetme sözdizimi.
  • Event Loop: Asenkron görevleri yöneten merkezi mekanizma.
  • TaskGroup: Python 3.11 ile gelen, görevleri güvenli ve yapılandırılmış bir şekilde yöneten yeni standart.
  • Performans: Bağımsız işlemlerin paralel yürütülerek toplam işlem süresinin en yavaş görevin süresine indirgenmesi.

Kaynaklar ve Sonraki Adımlar

Asenkron programlamanın derinliklerine inmek isterseniz, aiohttp kütüphanesini inceleyerek gerçek HTTP isteklerini asenkron olarak nasıl yapabileceğinizi öğrenebilirsiniz. Ayrıca asyncio.Queue ile üretici-tüketici (producer-consumer) modellerini keşfetmek harika bir sonraki adım olacaktır.

Ahmet Aksoy

Not: Bu yazıda incelediğimiz kodu ve benzer projelerin kaynak kodlarını https://github.com/ahmetax/practical-python-examples adresinde bulabilirsiniz.

python, python programlama, python öğren, yazılım, kod, asyncio, asenkron programlama, eşzamanlılık, performans, başlangıç seviyesi

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir