Kotlin coroutines kavramı ve örnekleri 1.

Abdullah IŞIK
3 min readJun 10, 2022

Kotlin coroutines nedir ?

Coroutines kotlin dili ile birlikte gelen bir yapıdır ve kotlin ekibi coroutine’leri asenkron olarak çalışabilen, durdurulabilen hızlı ve hafif yapılar olarak tanımlar. Aslında thread yapılarına çok benzer çünkü kod bloklarını aynı anda çalıştırabilirler. Coroutine’ler threadler gibi tek bir thread yapısına bağlı değildir bulunduğu thread içinde durabilir,ölebilir ve bir başka thread üzerinde koşmaya devam edebilirler. Az önce bahsettiğim gibi thread yapılarına oldukça benzerdir fakat gerçek hayatta coroutines’leri thread yapılarından ayıran önemli farklar vardır.

Yukarıdaki kod satırları çalıştığın da ‘Merhaba’ çıktısı ilk olarak alınır bunun sebebi launch yapısı kodun geri kalanıyla eş zamanlı ve bağımsız olarak çalışmaya devam eden yeni bir thread başlatır.

Burada kullanılan ‘delay()’ suspend(Askıda kalabilen) bir fonksiyondur thread yapısını engellemeden belirli bir süre için coroutine’i geciktirir ve gecikme istenilen süre kadar devam eder.

Ayrıca Coroutine’ler sadece CoroutineScope içerisinde hayatlarını sürdürebilirler.

Yukarıda görüldüğü üzere doWorld() methodu suspend bir fonksiyondur bu yüzden bulunduğu scope içerisinde kodu duraklatabilir, çıktının ilk önce Merhabayı basmasının sebebi de bu yüzdendir. Kısaca runBlocking çalışmaya devam ederken launch içinde bulunan doWorld() metodu içerisindeki delay() yüzünden bulunduğu scope askıda kalmıştır.

runBlocking yapısına bakacak olursak coroutine olmayan dünya ile köprü görevi görmektedir ve içine bir CoroutineScope döner.

runBlocking ve coroutineScope yapıları benzer görülebilir çünkü ikiside kendilerinin tamamlanmasını beklerken aynı zamanda altında bulunan child scope’ların da bitmesini bekler. Temel fark runBlocking metodu bulunduğu thread’i bloke eder coroutineScope ise sadece askıya alır. bu ayrım yüzünden runBlocking standart(senkron) bir fonksiyondur coroutineScope ise askıya alınabilen(asenkron) bir fonksiyondur.

coroutineScope’u herhangi bir suspend fonksiyona atabilirsiniz yukarıdaki örnekteki gibi eşzamanlı olarak Merhaba ve Dünya’yı doWorld() çağırarak yazdırabilirsiniz.

Scope builder ve concurrency kavramları

Bir coroutineScope oluşturucu, birden çok concurrent(eşzamanlı) işlemi çalıştırmak için herhangi bir suspend fonksiyon içinde çağırabilir. şimdi bir suspend fonksiyon içerisinde 2 farklı concurrent coroutine başlatalım:

launch blokları içerisindeki her iki kod parçası da aynı anda yürütülür Dünya 1 başlangıçtan 1 saniye sonra yazdırılır Dünya 2 de onun peşini takip eder doWorld fonksiyonundaki coroutineScope yalnızca her iki launch da işlemlerini bitirdikten sonra tamamlanır, bu nedenle bitti yazısını görmemiz ancak askıdaki işlemler bittik’den sonra mümkün olur.

Coroutine Job nedir ?

Bir launch job nesnesi döner ve bu nesneler launcların referansını taşır. Bu sayede bir launch’ın tamamlanıp tamamlanmadığını joblar aracılığı ile kontrol edebiliriz.

Yukarıdaki örnekte Job içindeki child coroutine’lerin tamamlanması beklenir ve daha sonra sonuç çıktısı verilir.

Aşağıda bir job’ın statelerini görebilirsiniz. join() fonksiyonunu kullandığımızda suspend bir fonksiyon olduğu için bulunduğu scope askıda kalır join() yerin start() kullansaydık senkron şekilde çalışacaktı.

Coroutine’ler hafif yapılardır.

Coroutine’ler JVM thread’lerine göre daha az kaynak tüketir. yukarıdaki kod blokları çalıştığında 100k thread başlar ve bu threadler ciddi oranda az ram tüketir. Aynı programı jvm thread kullanarak yazarsanız (Örneğin Thread.sleep), muhtemelen çok fazla bellek tüketecek ve out-of memory hatası verecektir.

Kaynakça. https://kotlinlang.org/docs/coroutines-basics.html#coroutines-are-light-weight

--

--