Sobes.tech
Middle

Suspend modifikatorü ile bir fonksiyonun yürütülmesinin durdurulma imkânı nasıl sağlanır?

sobes.tech yapay zeka

AI'dan gelen yanıt

İşlev duraklatması, küroutinler ve devamlar (continuations) mekanizması sayesinde sağlanır.

  1. suspend modifikatoru: Derleyiciye, fonksiyonun duraklatılabileceğini ve daha sonra yeniden başlatılabileceğini belirtir; bu, akışın engellenmeden devam etmesini sağlar. Bu, fonksiyonun mutlaka duraklatılacağı anlamına gelmez.

  2. Derleyici dönüşümü: Derleyici, suspend fonksiyonunu bir durum makinesi haline getirir. Bu makine, fonksiyonun şu anki yürütme noktasını ve yerel değişkenlerini takip eder.

  3. Devam (Continuation): Bir suspend fonksiyonu çağrıldığında, gizli bir Continuation tipi parametre iletilir. Bu Continuation nesnesi, duraklatmaya neden olan asenkron işlemin tamamlanmasının ardından çağrılacak geri çağırma (callback) içerir. Ayrıca, yürütme bağlamını (zamanlayıcı, görev bağlamı vb.) saklar.

  4. Duraklatma: suspend fonksiyonu, asenkron bir işlem yapılması gereken noktaya geldiğinde (örneğin, ağ isteği, veritabanı okuma), thread'i engellemek yerine, mevcut durumu (yerel değişkenler, yürütme noktası) yakalar, Continuation nesnesine kaydeder ve kontrolü çağıran koda geri verir. Thread, diğer görevleri yerine getirmek üzere serbest bırakılır.

  5. Devam etme: Asenkron işlem tamamlandığında, ilgili geri çağırma (callback) çağrılır (bu, Continuation içinde saklanır). Bu geri çağırma, korutinanın yeniden başlayabileceğini bildirir. Korutina, Continuation'da saklanan durumu kullanarak yürütme bağlamını geri yükler ve duraklatıldığı noktadan devam eder.

// Örnek: gecikmeyi taklit eden suspend fonksiyon
suspend fun fetchData(): String {
    // Burada duraklatma gerçekleşir.
    // Korutina durumu kaydeder ve thread'i serbest bırakır.
    delay(1000) // kotlinx.coroutines'un suspend fonksiyonu
    // 1000 ms sonra, `Continuation`'a bağlı geri çağırma çağrılır,
    // ve korutina bu noktadan devam eder.
    return "Veriler yüklendi"
}