Sobes.tech
Middle+

Korutinalarda hamkorlikda ko'p vazifali ishlash qanday mexanizmlar bilan amalga oshiriladi?

sobes.tech AI

AIdan javob

Koroutinlarda kooperativ ko‘p vazifali ishlash quyidagi mexanizmlar orqali amalga oshiriladi:

  • Suspension Points: Koroutine ma'lum nuqtalarda "qaytariladigan" bo‘lishi mumkin (suspension points), bu threadni bloklamasdan. Bu suspend funksiyalarini chaqirish bilan yuzaga keladi. Suspend qilish vaqtida, koroutine bajarilayotgan thread boshqa vazifalarni bajarish uchun bo‘sh bo‘ladi.

  • Dispatchers: Koroutinlar Dispatchers yordamida bajariladigan threadlar to‘plamini aniqlaydi. Koroutine bir threadda suspend qilinishi va boshqa bir threadda davom ettirilishi mumkin.

  • Continuation: Har safar koroutine suspend qilinsa, Continuation obyekti yaratiladi, u koroutine holatini shu vaqtda saqlaydi. Koroutine davom ettirilganda, u bu obyektdan foydalanib, holatini tiklaydi va to‘xtatilgan joydan davom etadi.

  • Hamkorlik: Dasturchi kodda aniq suspend nuqtalarni belgilaydi. Bu kooperativ ko‘p vazifalilikni ta'minlaydi – koroutine o‘z xohishiga ko‘ra, muayyan nuqtalarda boshqa koroutine yoki vazifaga nazoratni beradi, operatsion tizim tomonidan majburan to‘xtatilish o‘rniga.

  • Strukturalashgan concurrency: Koroutinlar ma'lum bir CoroutineScope bilan bog‘langan. Bu, bir guruh koroutinlarni bir vaqtning o‘zida bekor qilish imkonini beradi va barcha bolalar koroutinlar ota-joyning tugashiga qadar yakunlanishini ta'minlaydi.

// Suspend funktsiya misoli, suspension point yaratadigan
suspend fun fetchDataFromNetwork(): String {
    // Tarmoq so‘rovi simulyatsiyasi
    delay(1000) // Bu suspend funktsiya - suspension point
    return "Ma'lumotlar olindi"
}

fun main() = runBlocking {
    // runBlocking hozirgi threadni bloklaydi va koroutine tugaguncha kutadi
    println("Boshlanish")

    launch {
        // Boshqa threadda (yoki shuningdek, dispatcherga bog‘liq)
        val data = fetchDataFromNetwork() // Bu yerda koroutine suspend bo‘lishi mumkin
        println("Olingan: $data")
    }

    println("Yakuni (asosiy thread fetchDataFromNetwork bilan bloklanmagan)")
    // Asosiy thread boshqa vazifalarni bajarishi mumkin, fetchDataFromNetwork kutayotgan paytda
}