# Coroutine

Adres: https://softwaredictionary.org/tr/terimler/coroutine
Kategori: Programlamanın Temelleri
Son güncelleme: 2026-10-06
Türkçe karşılığı: eş yordam
Okunuşu: korutin

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: Tek bir thread'i sırayla paylaşan iki coroutine (Python asyncio)

```python
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.

## Kaynaklar

- [Python documentation: Coroutines and Tasks](https://docs.python.org/3/library/asyncio-task.html)
- [Kotlin documentation: Coroutines](https://kotlinlang.org/docs/coroutines-overview.html)
- [PEP 492: Coroutines with async and await syntax](https://peps.python.org/pep-0492/)

---

Software Dictionary: https://softwaredictionary.org/tr · https://softwaredictionary.org/tr/llms.txt
