Coroutine
- Türkçe karşılığı
- eş yordam
- Okunuşu
- korutin
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Coroutine, yarıda duraklayıp kontrolü bırakabilen ve sonra kaldığı yerden devam eden bir fonksiyondur; böylece birçok görev birkaç thread'i sırayla paylaşır.
Coroutine (eş yordam) nedir?
Normal bir fonksiyon çağrıldığında baştan sona çalışır. Coroutine ise açıkça belirlediği noktalarda yarıda duraklayabilir ve daha sonra bütün yerel değişkenleri korunmuş olarak kaldığı yerden sürdürülebilir. Terimi 1958'de Melvin Conway ortaya attı; bugün bu fikir generator'ların, async/await'in ve Kotlin coroutine'lerinin temelinde yatıyor.
Coroutine'ler işbirlikçi çoklu görev (cooperative multitasking) kullanır: her biri, genellikle bir ağ yanıtını ya da belirli bir sürenin dolmasını beklerken, duraklamayı kendisi seçene kadar çalışır; ardından bir zamanlayıcı (scheduler), çoğu zaman bir event loop, hazır olan başka bir coroutine'i çalıştırır. Geçiş yalnızca küçük bir durumu kaydetmekten ibarettir ve işletim sistemi işe karışmaz; bu yüzden bir program bir avuç thread üzerinde binlerce, hatta milyonlarca coroutine çalıştırabilir. Python'da async def bir coroutine tanımlar ve her await duraklayabileceği bir noktadır; Kotlin duraklatılabilir fonksiyonları suspend ile işaretler, C++20 co_await ve co_yield ekledi, Lua'da ise coroutine.yield vardır.
Aynı anda birçok tahtada oynayan bir satranç ustasını düşünün: bir hamle yapar, o rakip düşünürken bir sonraki tahtaya geçer ve daha sonra döndüğünde her oyunu tam bıraktığı gibi bulur. Coroutine'ler birçok ağ bağlantısıyla aynı anda ilgilenen sunuculara, değerleri tek tek üreten generator'lara, birkaç kare bekleyen oyun betiklerine ve veri yüklenirken yanıt vermeyi sürdürmesi gereken arayüzlere güç verir.
Coroutine'ler sıklıkla thread'lerle karıştırılır. İşletim sistemi thread'leri kesintili (preemptive) olarak zamanlar, yani onları herhangi bir komutta durdurabilir, ve thread'ler birkaç çekirdek üzerinde paralel çalışabilir; coroutine'ler ise yalnızca kendi seçtikleri yerlerde geçiş yapar, bu yüzden iki duraklama arasındaki kod aynı thread'deki diğer coroutine'lerle asla iç içe geçmez. Bunun öbür yüzü şudur: duraklamadan uzun süre CPU işi yapan bir coroutine, kendi thread'indeki her şeyi bloke eder. Async/await birçok dilin coroutine yazmak için kullandığı söz dizimidir; Go'nun goroutine'leri ise adlarına rağmen daha çok hafif thread'ler gibi davranır.
Önemli noktalar
- Coroutine yarıda duraklayabilir ve daha sonra yerel durumu korunmuş olarak devam edebilir.
- Coroutine'ler kontrolü kendi istekleriyle bırakır; buna işbirlikçi çoklu görev denir.
- Thread'lerden çok daha ucuzdurlar; bu yüzden bir program binlercesini çalıştırabilir.
- Python'ın async fonksiyonları ve generator'ları ile Kotlin'in suspend fonksiyonları, coroutine'in farklı biçimleridir.
- Hiç duraklamayan bir coroutine, kendi thread'indeki diğer bütün coroutine'leri bloke eder.
Örnek
import asyncio
async def download(name, seconds):
print(f"{name}: started")
await asyncio.sleep(seconds) # pause here; the event loop runs the other one
print(f"{name}: finished") # resume later with every local variable intact
return name
async def main():
# Both coroutines run on a single thread, taking turns
results = await asyncio.gather(download("a", 2), download("b", 1))
print(results) # ['a', 'b'] after about 2 seconds, not 3
asyncio.run(main())Sık sorulan sorular
Coroutine ile thread arasındaki fark nedir?
Thread'leri işletim sistemi zamanlar; onları her an kesebilir ve paralel çalıştırabilir. Coroutine'leri ise program zamanlar; yalnızca kendi seçtikleri noktalarda geçiş yaparlar ve çok daha az bellek kullanırlar, bu yüzden çok daha fazlasını çalıştırabilirsiniz. Birçok çalışma ortamı coroutine'leri küçük bir thread havuzunun üzerinde çalıştırır.
Goroutine'ler coroutine midir?
Tam olarak değil. Goroutine'ler, Go çalışma ortamının yönettiği hafif thread'lerdir: Go 1.14'ten bu yana çalışma ortamı onları kesebilir ve CPU çekirdekleri arasında paralel çalışırlar. Ad, coroutine sözcüğüyle yapılmış bir kelime oyunudur.
Async/await ile coroutine aynı şey mi?
Async/await, coroutine yazmanın söz dizimidir. Python'da bir async def fonksiyonunu çağırmak bir coroutine nesnesi döndürür ve her await duraklayabileceği bir noktadır; C#, JavaScript ve Rust da async fonksiyonları benzer, duraklatılabilir durum makinelerine dönüştürür.
İlgili sayfalar
- Threadİşletim Sistemleri, s. 34Thread, işletim sisteminin zamanlayabileceği en küçük yürütme birimidir; bir process içinde çalışır ve o process'in belleğini diğer thread'lerle paylaşır.
- Async/AwaitProgramlamanın Temelleri, s. 2Async/await, asenkron kodu sıradan adım adım kod gibi okunur biçimde yazmayı sağlayan, her await'te bir promise ya da görev bitene dek duran sözdizimidir.
- EşzamanlılıkProgramlamanın Temelleri, s. 22Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerleyebilme yeteneğidir; örneğin birçok kullanıcıya aynı anda hizmet vermek gibi.
- Event LoopBackend ve API'ler, s. 14Event loop, olaylar ve I/O sonuçları hazır oldukça callback'leri tek tek çalıştırarak tek bir iş parçacığının birçok görevi yönetmesini sağlayan mekanizmadır.
- PromiseProgramlamanın Temelleri, s. 51Promise, asenkron bir işlemin nihai sonucunu temsil eden bir nesnedir; iş bittiğinde kodun başarıya ya da hataya tepki vermesini sağlar.
- IteratorProgramlamanın Temelleri, s. 30Iterator, verinin nasıl saklandığını açığa çıkarmadan, konumunu hatırlayarak bir koleksiyonun öğeleri arasında teker teker ilerlemeyi sağlayan bir nesnedir.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin