Sobes.tech
Middle+

Korutinlerde işbirlikçi çoklu görev nasıl mekanizmalarla gerçekleştirilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Koritinlerde kooperatif çoklu görev, aşağıdaki mekanizmalarla gerçekleştirilir:

  • Askıya Alma Noktaları: Koroutine, belirli noktalarda (askıya alma noktaları) "askıya alınabilir" ve bu, akışı engellemeden gerçekleşir. Bu, suspend fonksiyonlarının çağrılmasıyla olur. Askıya alma sırasında, koroutine'nin çalıştığı thread diğer görevleri yerine getirmek üzere serbest kalır.

  • Dispatchers: Koroutinler, Dispatchers kullanarak çalıştırılacak thread havuzunu belirler. Bir koroutine, bir thread üzerinde askıya alınabilir ve başka bir thread üzerinde devam ettirilebilir.

  • Continuation: Her askıya alma durumunda, o anda koroutine'nin durumunu tutan bir Continuation nesnesi oluşturulur. Koroutine devam ettirildiğinde, bu nesne kullanılarak durumu geri yüklenir ve askıya alındığı yerden devam eder.

  • İşbirliği: Geliştirici, kodda açıkça suspend noktalarını belirtir. Bu, çoklu görevi "işbirlikçi" hale getirir – koroutine, belirli noktalarda başka bir koroutine veya göreve kontrolü gönüllü olarak devreder, işletim sistemi tarafından zorla kesilmek yerine.

  • Yapısal Eşzamanlılık: Koroutinler, belirli bir kapsam (CoroutineScope) ile ilişkilidir. Bu, bir grup koroutine'nin aynı anda iptal edilmesine olanak tanır ve tüm alt koroutinlerin ebeveyn kapsamı sona erdiğinde tamamlanmasını sağlar.

// Askıya alma noktası oluşturan suspend fonksiyon örneği
suspend fun fetchDataFromNetwork(): String {
    // Ağ isteği simülasyonu
    delay(1000) // Bu bir suspend fonksiyon - askıya alma noktasıdır
    return "Veriler alındı"
}

fun main() = runBlocking {
    // runBlocking, bir CoroutineScope oluşturur ve koroutine tamamlanana kadar mevcut thread'i engeller
    println("Başlangıç")

    launch {
        // Başka bir thread'de (veya aynı, dispatcher'a bağlı olarak) koroutine başlatır
        val data = fetchDataFromNetwork() // Burada koroutine askıya alınabilir
        println("Alınan: $data")
    }

    println("Son (ana thread fetchDataFromNetwork tarafından engellenmiyor)")
    // Ana thread, fetchDataFromNetwork beklerken diğer görevleri yapabilir
}