Sobes.tech
Middle

Kotlin, paralel hesaplamalarla çalışmak için hangi mekanizmaları sağlar?

sobes.tech yapay zeka

AI'dan gelen yanıt

  • Koruletler (Coroutines): Hafif yapılı akışlar, asenkron kodu imperatif tarzda yazmaya olanak tanır ve engelleyici çağrılardan kaçınır. Yeniden başlatılabilir fonksiyonlara dayanır ve yerel akışlara bağlı değildir.
  • Dispatchers: Koruletin çalışacağı akış veya akış havuzunu belirler.
    • Dispatchers.Default: Kaynak yoğun görevler için (örneğin, CPU-bound).
    • Dispatchers.IO: G/Ç işlemleri için (örneğin, ağ istekleri, dosya işlemleri).
    • Dispatchers.Main: Ana akışta kod çalıştırmak için (örneğin, Android uygulamasında UI güncellemesi).
    • Dispatchers.Unconfined: Korulet, ilk suspend fonksiyonuna kadar mevcut akışta çalışır.
  • Suspend fonksiyonlar: Duraklatılabilir ve daha sonra devam ettirilebilir fonksiyonlar. suspend modifiyesi ile işaretlenir.
  • Context: Korulet hakkında bilgi içerir, örneğin dispatcher, job ve istisna işleyici.
  • Job: Koruletin yaşam döngüsünü temsil eder (başlatıldı, aktif, tamamlandı, iptal edildi). Korulet yönetimini sağlar (iptal et, tamamlanmasını bekle).
  • Scope: Koruletler için kapsam belirler ve yaşam döngülerini yönetir.
  • MutableStateFlow / SharedFlow: kotlinx.coroutines.flow kütüphanesinde, korutinalar arasında güvenli veri alışverişi sağlar.
  • Mutex: Kritik bölümleri korumak için senkronizasyon primitive'i.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Korulet ve dispatcher kullanımı örneği
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("İş korutinası: $i")
            delay(100) // Engelleyici olmayan gecikme
        }
    }
    println("Korulet başlatıldı")
    job.join() // Koruletin tamamlanmasını bekle
    println("Korulet tamamlandı")
}
// Suspend fonksiyon örneği
suspend fun fetchData(): String {
    delay(1000) // Ağ isteği simülasyonu
    return "Veriler alındı"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        counter++
    }
}