Sobes.tech
Middle

Корутин дар Kotlin чист ва чӣ гуна кор мекунад?

sobes.tech AI

Ҷавоб аз AI

Корутина дар Kotlin — ин як воҳиди сабукест, ки имкон медиҳад, ки коди асинхронии бе блокиратсияро бо роҳати бештар ва тартибпазир нависед. Он монанд ба ҷараён (thread), аммо хеле сабуктар аст ва метавонад ба миқдори зиёд эҷод шавад.

Компонентҳои асосӣ ва принсипҳои кор:

  • Suspend Functions (Suspendable Functions): Функсияҳое, ки бо калимаи калидии suspend ишора шудаанд, метавонанд иҷрои худро муваққатан боздоранд (suspend), бе блок кардани ҷараён, ки дар он иҷро мешаванд. Вақте ки функсияи муваққатан боздошта анҷом меёбад, он метавонад иҷрои худро аз ҷое, ки боздошта буд, идома диҳад.
  • Context (Coroutine context): Ҷамъбандии унсурҳоест, ки рафтори корутинҳоро идора мекунад. Дар контекст дохил мешаванд:
    • Job: Тавсифи корутин, ки имкон медиҳад, ки ҳаёти он (блок кардан, интизор шудан барои анҷом) идора карда шавад.
    • CoroutineDispatcher: Муайян мекунад, ки дар кадом ҷараён(ҳо) корутин иҷро мешавад. Имкон медиҳад, ки байни ҷараёнҳо гузариш кунад.
    • CoroutineName: Номи ихтиёрӣ барои дебаг.
    • CoroutineExceptionHandler: Ҳамлагари истисноҳои беҳисоб.
  • Builders (Сохтандагон): Функсияҳое, ки иҷрои корутинҳоро оғоз мекунанд:
    • launch: Корутин навро оғоз мекунад, бе баргардонидани натиҷа. Job-ро бармегардонад.
    • async: Корутин навро оғоз мекунад, ки натиҷа медиҳад (Deferred). Барои гирифтани натиҷа истифода мешавад .await().
    • runBlocking: Сохтани бандӣ, ки асосан барои тест ё ҳамгироӣ бо коди бандишаванда истифода мешавад.

Чӣ гуна ин дар зери капот кор мекунад:

Корутиҳо ҷараёнҳои алоҳида барои ҳар як вазифа намесозанд. Баръакс, вақте ки функсияи suspend боздошта мешавад, компилятор коде истеҳсол мекунад, ки ҳолати ҳозираи ҳисобҳоро нигоҳ медорад. Вақте ки натиҷа дастрас мешавад, корутин дар яке аз ҷараёнҳои, ки CoroutineDispatcher идора мекунад, идома меёбад. Ин тавассути табдил додани функсияҳои suspend ба даъвоҳои асинхронӣ бо идомаҳо (continuation-passing style) ба даст меояд, ки имкон медиҳад, ки як ҷараён бисёр корутинҳоро иҷро кунад, дар ҳоле ки онҳо дар вақти боздоштан гузариш мекунанд.

Масалан:

import kotlinx.coroutines.*

fun main() = runBlocking { // Ҷараёнро то анҷом додани корутин дар дохили runBlocking банд мекунад
    println("Аввал")

    launch { // Корутин навро дар пасзамина оғоз мекунем
        delay(1000L) // Тафсири бе блокиратсия барои 1 сония
        println("Пас аз таъхир")
    }

    println("Пас") // Ин сатр пеш аз анҷоми корутин launch иҷро мешавад
}

Натиҷаи ин код хоҳад буд:

Аввал
Пас
Пас аз таъхир

Ин нишон медиҳад, ки launch ва delay хусусияти бе блокиратсия доранд.