Sobes.tech
Middle+

Korutinalarda əməkdaşlıq edən çoxlu tapşırıq necə mexanizmlərlə həyata keçirilir?

sobes.tech Süni İntellekt

AI-dan cavab

Koroutinlarda kooperativ çoxlu vəzifə yerinə yetirmə aşağıdakı mexanizmlər vasitəsilə həyata keçirilir:

  • Səssizlik Nöqtələri: Koroutine müəyyən nöqtələrdə (səssizlik nöqtələri) "dayandırıla" bilər, bu isə thread-i bloklamadan baş verir. Bu, suspend funksiyalarını çağırmaqla olur. Dayandırma zamanı, koroutine-in icra olunduğu thread digər tapşırıqları yerinə yetirmək üçün sərbəst olur.

  • Dispatchers: Koroutinlər Dispatchers istifadə edərək, icra ediləcək thread hovuzunu müəyyən edir. Bir koroutine bir thread-də dayandırıla və başqa bir thread-də davam etdirilə bilər.

  • Davam: Hər dəfə koroutine dayandırıldıqda, Continuation obyekti yaradılır və bu, koroutine-in həmin anki vəziyyətini saxlayır. Koroutine davam etdirildikdə, bu obyekt istifadə edilərək vəziyyət bərpa olunur və dayandırıldığı yerdən davam edir.

  • Əməkdaşlıq: İnkişaf etdirici kodda açıq şəkildə suspend nöqtələrini göstərir. Bu, çoxlu vəzifə yerinə yetirməni "əməkdaşlıqçı" edir – koroutine, müəyyən nöqtələrdə başqa bir koroutine və ya tapşırığa idarəni könüllü şəkildə verir, əməliyyat sisteminin məcburi kəsilməsindən fərqli olaraq.

  • Strukturlu Eşzamanlılıq: Koroutinlər müəyyən bir CoroutineScope ilə əlaqəlidir. Bu, eyni zamanda bir qrup koroutine-i ləğv etməyə imkan verir və bütün uşaq koroutinlərin valideyn sahəsi bitdikdə tamamlanmasını təmin edir.

// Dayandırma nöqtəsi yaradan suspend funksiyanın nümunəsi
suspend fun fetchDataFromNetwork(): String {
    // Şəbəkə sorğusunun simulasyonu
    delay(1000) // Bu, suspend funksiyasıdır - dayandırma nöqtəsi
    return "Məlumatlar alındı"
}

fun main() = runBlocking {
    // runBlocking cari thread-i bloklayır və koroutine tamamlanana qədər gözləyir
    println("Başlanğıc")

    launch {
        // Başqa thread-də (və ya eyni, dispatcher-ə bağlı olaraq) koroutine başlat
        val data = fetchDataFromNetwork() // Burada koroutine dayandırıla bilər
        println("Alınan: $data")
    }

    println("Son (əsas thread fetchDataFromNetwork ilə bloklanmayıb)")
    // Əsas thread digər tapşırıqları yerinə yetirə bilər, fetchDataFromNetwork gözləyərkən
}