Kotlin'de coroutine nedir ve nasıl çalışır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Kotlin'deki coroutine, daha okunabilir ve ardışık bir şekilde yazılmasını sağlayan hafif bir yürütme birimidir. Bir thread'e benzer, ancak çok daha hafiftir ve büyük miktarlarda oluşturulabilir.
Ana bileşenler ve çalışma prensipleri:
- Askıya alınabilen Fonksiyonlar (Suspend Functions):
suspendanahtar kelimesi ile işaretlenmiş fonksiyonlar, yürütüldükleri thread'i engellemeden duraklatabilirler. Bir askıya alınmış fonksiyon, bekleme (örneğin, ağ isteği) işlemini tamamladığında, duraklatıldığı yerden devam edebilir. - Bağlam (Coroutine Context): Coroutine'in davranışını kontrol eden öğeler kümesi. İçerir:
Job: Coroutine'in yaşam döngüsünü yönetmeye yarayan tanımlayıcı.CoroutineDispatcher: Coroutine'in çalışacağı thread veya threadleri belirler. Threadler arasında geçiş yapmayı sağlar.CoroutineName: Hata ayıklama için isteğe bağlı isim.CoroutineExceptionHandler: İşlenmemiş istisnaları yakalayan hata yöneticisi.
- İnşa Ediciler (Builders): Coroutine'leri başlatan fonksiyonlar:
launch: Yeni bir coroutine başlatır, sonuç döndürmez.Jobdöner.async: Sonuç döndüren yeni bir coroutine başlatır (Deferred). Sonucu almak için.await()kullanılır.runBlocking: Bloklayıcı inşa edici, genellikle testlerde veya bloklayan kod ile entegrasyonda kullanılır.
Arka planda nasıl çalışır:
Coroutine'ler, her görev için ayrı thread'ler oluşturmaz. Bunun yerine, suspend fonksiyonları duraklatıldığında, derleyici mevcut hesaplama durumunu kaydeden kodlar üretir. Sonuç hazır olduğunda, coroutine, CoroutineDispatcher tarafından yönetilen thread'lerden birinde yeniden başlatılır. Bu, suspend fonksiyonlarının, devam ettirmeler (continuations) ile asenkron çağrılara dönüştürülmesiyle sağlanır; böylece tek bir thread, birden fazla coroutine'i çalıştırabilir ve duraklatıldıklarında arasında geçiş yapabilir.
Örnek:
import kotlinx.coroutines.*
fun main() = runBlocking { // Mevcut thread'i, içindeki coroutine tamamlanana kadar engeller
println("İlk")
launch { // Arka planda yeni bir coroutine başlatır
delay(1000L) // Engellemeden 1 saniyelik gecikme
println("Gecikmeden sonra")
}
println("Sonra") // Bu satır, launch coroutine'inin tamamlanmasından önce çalışır
}
Bu kodun çıktısı:
İlk
Sonra
Gecikmeden sonra
Bu, launch ve delay'in engellemez doğasını gösterir.