asyncio ile Eşzamanlı Programlama: Adım Adım Rehber
Python'da asyncio, birden fazla işi aynı anda yürütmek için kullanılan bir kütüphanedir. Tek bir thread içinde hızlı geçişlerle işleri yönetir, bu da ağ istekleri veya dosya okuma gibi bekleme sürelerini verimli kullanmanızı sağlar.
Asyncio üç ana parçadan oluşur:
Coroutine: async def ile tanımlanan fonksiyonlardır. Bunlar await ile duraklatılabilir.
Event Loop: Tüm coroutine'leri yönetir, sırasıyla çalıştırır.
await: Bir coroutine'nin bitmesini beklerken, diğer işlerin yapılmasını sağlar.
Başlamak için async def ile bir fonksiyon yazın:
1import asyncio23async def selamla(isim):4print(f"Merhaba {isim}")5await asyncio.sleep(1) # 1 saniye bekle6print(f"{isim} işi bitti")78asyncio.run(selamla("Ali"))Çıktı:
```
Merhaba Ali
Ali işi bitti
```
Birden fazla işi aynı anda yapmak için asyncio.gather() kullanın:
1import asyncio23async def görev(ad, saniye):4print(f"{ad} başladı")5await asyncio.sleep(saniye)6print(f"{ad} bitti ({saniye}s sonra)")7return f"{ad} sonucu"89async def ana():10sonuçlar = await asyncio.gather(11görev("Görev1", 2),12görev("Görev2", 1),13görev("Görev3", 3)14)15print("Tüm görevler tamamlandı:", sonuçlar)1617asyncio.run(ana())Çıktı:
```
Görev1 başladı
Görev2 başladı
Görev3 başladı
Görev2 bitti (1s sonra)
Görev1 bitti (2s sonra)
Görev3 bitti (3s sonra)
Tüm görevler tamamlandı: ['Görev1 sonucu', 'Görev2 sonucu', 'Görev3 sonucu']
```
Gördüğünüz gibi görevler sırayla değil, paralel çalıştı. Toplam süre 6 saniye yerine 3 saniye oldu.
HTTP istekleri ile veri çekme:
1import asyncio2import time34async def veri_indir(url, gecikme):5print(f"{url} indiriliyor...")6await asyncio.sleep(gecikme) # Ağ isteğini simüle et7print(f"{url} tamamlandı")8return f"{url} verileri"910async def ana():11başlangıç = time.time()12sonuçlar = await asyncio.gather(13veri_indir("site1.com", 2),14veri_indir("site2.com", 3),15veri_indir("site3.com", 1)16)17süre = time.time() - başlangıç18print(f"Toplam süre: {süre:.1f}s")19print("İndirilen veriler:", sonuçlar)2021asyncio.run(ana())Çıktı:
```
site1.com indiriliyor...
site2.com indiriliyor...
site3.com indiriliyor...
site3.com tamamlandı
site1.com tamamlandı
site2.com tamamlandı
Toplam süre: 3.0s
İndirilen veriler: ['site1.com verileri', 'site2.com verileri', 'site3.com verileri']
```
asyncio ile programlama yazmanız gereken kodu değiştirmez, sadece bekleme sürelerini akıllı kullanır. async def, await ve asyncio.gather() öğrendikten sonra, çoğu eşzamanlı problemi çözebilirsiniz.
0 yorum