Asenkron programlama: beklerken bloke olmayan kod yazmak
Asenkron programlama, bir işlem beklerken programın diğer işleri yapmaya devam etmesini sağlar. Çalışma mantığı, async/await örneği ve kullanım alanları.
Asenkron programlama nedir?
Asenkron programlama, uzun süren bir işlemin (ağ isteği, dosya okuma, veritabanı sorgusu) tamamlanmasını beklerken programın o noktada durmayıp başka işleri yürütmeye devam etmesini sağlayan bir yazım ve çalışma modelidir. İşlem bittiğinde sonuç, bir geri çağrı (callback), söz (promise) ya da await ifadesi aracılığıyla koda geri teslim edilir.
Senkron modelde her satır bir öncekinin bitmesini bekler. Bu model basit ve okunaklıdır ama bir ağ yanıtı beklerken bütün program, kullanıcı arayüzü ya da sunucudaki diğer istekler kilitlenebilir. Asenkron model, bekleme süresinin boşa gitmesini engeller.
Nasıl çalışır?
Çoğu asenkron ortamda temel yapı bir olay döngüsüdür (event loop). Döngü, bekleyen görevleri bir kuyrukta tutar. Bir görev bir G/Ç işlemi başlatıp sonucu beklemesi gerektiğinde kontrolü döngüye geri verir; döngü sıradaki hazır görevi çalıştırır. Beklenen işlem bittiğinde ilgili görev yeniden hazır olarak işaretlenir ve sırası geldiğinde kaldığı yerden devam eder.
Burada kritik nokta şudur: asenkron programlama kendi başına ayrı bir işlemci çekirdeği kullanmak anlamına gelmez. Tek iş parçacıklı bir olay döngüsü bile, çok sayıda G/Ç beklemesini iç içe geçirerek yüksek eşzamanlılık sağlayabilir. Yoğun hesaplama gerektiren işler ise döngüyü kilitler ve ayrı bir süreç ya da iş parçacığına verilmelidir.
async/await ile küçük örnek
Modern dillerde asenkron kod, okunması zor geri çağrı zincirleri yerine async ve await anahtar sözcükleriyle senkron koda benzer biçimde yazılır. Python'da asyncio ile örnek:
import asyncio
async def getir(ad, gecikme): await asyncio.sleep(gecikme) return ad
async def main(): sonuc = await asyncio.gather(getir("siparis", gecikme_a), getir("stok", gecikme_b)) print(sonuc)
asyncio.run(main())
Burada çağrılar sırayla değil birlikte başlatılır; toplam süre gecikmelerin toplamı değil, en uzun olanının süresine yakın olur. JavaScript'te aynı fikir Promise.all ile ifade edilir. Anahtar fark, await'in yalnızca o fonksiyonu duraklatması, programın geri kalanını durdurmamasıdır.
Nerelerde kullanılır, nelere dikkat edilir?
Asenkron programlama özellikle G/Ç yoğun işlerde değerlidir: çok sayıda eşzamanlı isteği karşılayan web sunucuları, başka servisleri çağıran API'ler, mesaj kuyruğu tüketicileri, web kazıyıcılar ve kullanıcı arayüzü olay işleyicileri. Python tarafında FastAPI gibi çerçeveler, JavaScript tarafında ise tarayıcı ve Node.js ortamı bu modele dayanır.
Sık yapılan hatalar da bellidir:
- Asenkron fonksiyon içinde engelleyici (blocking) bir çağrı yapıp döngüyü kilitlemek
- await unutarak sonucu beklemeden ilerlemek
- Hata ve zaman aşımı yönetimini atlamak, yarım kalan görevleri iptal etmemek
- Çok sayıda eşzamanlı görevi sınırlamadan başlatıp karşı sistemi boğmak
Hata ayıklamak da senkron koda göre zordur, çünkü yürütme sırası kodun yazılış sırasıyla örtüşmez.
Benzer kavramlardan farkı
Eşzamanlılık (concurrency), birden çok işin iç içe ilerlemesidir; paralellik (parallelism) ise gerçekten aynı anda birden çok çekirdekte çalışmasıdır. Asenkron programlama birincil olarak eşzamanlılık aracıdır. Çok iş parçacıklı programlama ise paralelliği ve eşzamanlılığı birlikte sağlayabilir ama paylaşılan durum ve kilitleme gibi ek karmaşıklık getirir.
Geri çağrılar, promise nesneleri ve async/await aynı fikrin farklı yazım biçimleridir. Asenkron iletişim kavramı, mikroservislerde mesaj kuyruğu üzerinden haberleşmek için de kullanılır; burada anlatılan ise programın içindeki yürütme modelidir.
Mindset programlarında asenkron programlama
Modern JavaScript ve Asenkron Programlama programı olay döngüsünü, Promise ve async/await yapısını ve ileri asenkron desenleri ele alır; tarayıcı ve Node.js ile çalışan geliştirici ekiplere uygundur. Asenkron Python (asyncio) ile Yüksek Eşzamanlılık, görev yönetimi, zaman aşımı, iptal ve geri basıncı işler. Python FastAPI ve Python ile Web Geliştirme eğitimleri ise asenkron veritabanı erişimi ve arka plan görevleri üzerinden bu modeli servis geliştirmeye taşır.
Kurumsal yazılım ekiplerinde bu içerikler, yanıt süresi sorunları yaşayan servislerde eşzamanlılık kararlarını bilinçli almak isteyen arka uç geliştiricileri için bir temel oluşturur.
İlgili Mindset programı
Modern JavaScript (ES2023+) ve Asenkron Programlama
Sık sorulan sorular
Asenkron kod her zaman daha hızlı mıdır?
Hayır. Asenkron model, bekleme sürelerini birbirine bindirerek toplam bekleme süresini kısaltır; hesaplama süresini kısaltmaz. Yoğun hesaplama yapan bir kodu asenkron yazmak hızlandırmaz, hatta döngüyü kilitleyebilir. Kazanç, G/Ç beklemesinin baskın olduğu işlerde ortaya çıkar.
Asenkron ile paralel çalışma aynı şey mi?
Aynı değildir. Asenkron programlama tek bir iş parçacığında bile birçok işi iç içe yürütebilir. Paralellik ise birden çok çekirdeğin gerçekten aynı anda çalışmasıdır. Bunlar birlikte de kullanılabilir: örneğin her çekirdekte ayrı bir olay döngüsü çalıştırılabilir.
async/await neden geri çağrılardan daha iyi sayılır?
Çünkü kodun okunuş sırasını yürütme sırasına yaklaştırır. Geri çağrılar iç içe girdiğinde okunması ve hata yakalaması zorlaşan yapılar oluşur. async/await ile hata yönetimi try ve catch ya da except bloklarıyla senkron kodda alışılmış biçimde yapılır.
Asenkron programlamayı öğrenmeye nereden başlamalı?
Önce kullandığınız dilin olay döngüsü modelini ve senkron-asenkron farkını anlayın. Ardından bir ağ isteğini async/await ile yazın, birkaç isteği birlikte başlatın, sonra zaman aşımı ve hata yönetimini ekleyin. Küçük bir deneyle sıra ve sürelerin nasıl değiştiğini ölçmek kavramı yerleştirir.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme