Sobes.tech
Middle

Котлин барои кор бо амалиётҳои асинхронӣ кадом имкониятҳоро пешниҳод мекунад?

sobes.tech AI

Ҷавоб аз AI

Котлин корутинҳоро (coroutines) барои содда кардани амалҳои асинхронӣ пешниҳод мекунад, ки ҷараёнҳои сабукро пешниҳод мекунанд, ки наметавонанд ҷараёни асосиро банданд.

Мушаххасоти асосӣ:

  • Функсияҳои истодагирӣ: Функсияҳое бо калимаи калидии suspend, ки метавонанд истодагирӣ ва идома ёбанд. Онҳо ҷараёни иҷроишро банд намекунанд.
    suspend fun fetchData(): String {
        delay(1000) // Имитацияи амали дароз
        return "Маълумот гирифта шуд"
    }
    
  • Сохтани корутинҳо: Функсияҳое, ки барои оғоз кардани корутинҳо истифода мешаванд:
    • launch: Корутинро оғоз мекунад ва Job-ро бармегардонад (бенукта).
      GlobalScope.launch {
          println("Корутин оғоз шуд")
      }
      
    • async: Корутинро оғоз мекунад ва Deferred<T>-ро бармегардонад (.await()-ро дар даъват кардан блок мекунад).
      val deferred = GlobalScope.async {
          fetchData()
      }
      // ...
      val result = deferred.await() // Натиҷаро интизор мешавем
      
    • runBlocking: Воридшавии ҷараёнро то анҷоми корутин банд мекунад (асосан барои гузариш байни кодҳои банд ва бенукта истифода мешавад, масалан, дар тестҳо).
      runBlocking {
          val data = fetchData()
          println(data)
      }
      
  • Контексти корутин: Ҷамъе аз унсурҳо, ки рафтори корутинро муайян мекунанд, аз ҷумла Dispatcher ва Job.
    • Dispatcher: Нишон медиҳад, ки корутин дар кадом ҷараён ё пуле аз ҷараёнҳо иҷро мешавад.
  • Dispatchers: Объектҳои дарунсохт барои идоракунии ҷараёнҳо:
    • Dispatchers.Default: Пул умумии ҷараёнҳои пасзамина.
    • Dispatchers.IO: Ба оптимизатсия барои воридот/баромад (дискӣ, шабакавӣ) равона шудааст.
    • Dispatchers.Main: Ҷараёни асосии UI (барои Android, JavaFX ва ғайра).
    • Dispatchers.Unconfined: Корутинро дар ҷараёни ҳозира оғоз мекунад, аммо пас аз истодагирӣ метавонад дар ҳар кадом ҷараён идома ёбад.
    GlobalScope.launch(Dispatchers.IO) {
        // Дар ҷараёни воридот/баромад иҷро мешавад
    }
    
  • Конкуренсияи сохторӣ: Принсипе, ки мувофиқи он корутинҳо дорои падар (CoroutineScope) мебошанд ва автоматӣ бо лағв кардани падар лағв мешаванд. Ин ба пешгирии сӯхтани захираҳо кӯмак мекунад ва идоракунии давраи ҳаётиро осон мекунад.
    // CoroutineScope ба таври автоматӣ кӯдаконро идора мекунад
    val scope = CoroutineScope(Dispatchers.Default)
    val job = scope.launch {
        // ...
    }
    // Вақте ки scope лағв мешавад, ҳамаи кӯдакони корутин лағв мешаванд
    scope.cancel()
    
  • Каналҳо: Каналҳо барои интиқоли бехатари маълумот байни корутинҳо. Мумкин аст:
    • Unbuffered: қабул танҳо пас аз фиристодан иҷро мешавад.
    • Buffered: Имкон медиҳад, ки чанд элемент пеш аз бастани фиристода шавад.
    • Conflated: танҳо охирин элементро нигоҳ медорад.
    val channel = Channel<Int>()
    
    scope.launch {
        for (x in 1..5) channel.send(x)
        channel.close()
    }
    
    scope.launch {
        for (y in channel) println(y)
    }
    
  • Flow: Ҷараёни маълумот, ки метавонад чанд арзишро асинхронӣ интиқол диҳад. Монанд ба RxJava Observable, аммо сабуктар ва бо корутинҳо ҳамҷоя.
    fun simpleFlow(): Flow<Int> = flow {
        for (i in 1..3) {
            delay(100)
            emit(i) // Фиристодани арзиш
        }
    }
    
    runBlocking {
        simpleFlow().collect { value -> println(value) } // Истифодаи арзишҳо
    }
    

Ин имконот имкон медиҳанд, ки кодҳои асинхронро дар услуби императив нависед, ки онро хондан ва нигоҳдорӣ осонтар мекунад, нисбат ба истифодаи callback-ҳо ё Future.