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,
suspendfunksiyaları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
Dispatchersistifadə 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,
Continuationobyekti 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ə
suspendnö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
CoroutineScopeilə ə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
}