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 asyncio
2
3async def selamla(isim):
4print(f"Merhaba {isim}")
5await asyncio.sleep(1) # 1 saniye bekle
6print(f"{isim} işi bitti")
7
8asyncio.run(selamla("Ali"))

Çıktı:
```
Merhaba Ali
Ali işi bitti
```

Birden fazla işi aynı anda yapmak için asyncio.gather() kullanın:

1import asyncio
2
3async 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"
8
9async 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)
16
17asyncio.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 asyncio
2import time
3
4async def veri_indir(url, gecikme):
5print(f"{url} indiriliyor...")
6await asyncio.sleep(gecikme) # Ağ isteğini simüle et
7print(f"{url} tamamlandı")
8return f"{url} verileri"
9
10async 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)
20
21asyncio.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.

konu hakkında tepkinizi verebilirsiniz