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.
-
suspendmodifikatoru: 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. -
Derleyici dönüşümü: Derleyici,
suspendfonksiyonunu bir durum makinesi haline getirir. Bu makine, fonksiyonun şu anki yürütme noktasını ve yerel değişkenlerini takip eder. -
Devam (Continuation): Bir
suspendfonksiyonu çağrıldığında, gizli birContinuationtipi parametre iletilir. BuContinuationnesnesi, 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. -
Duraklatma:
suspendfonksiyonu, 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,Continuationnesnesine kaydeder ve kontrolü çağıran koda geri verir. Thread, diğer görevleri yerine getirmek üzere serbest bırakılır. -
Devam etme: Asenkron işlem tamamlandığında, ilgili geri çağırma (
callback) çağrılır (bu,Continuationiç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"
}