Sobes.tech
Middle

Comment fonctionne la construction async/await dans le langage de programmation Kotlin?

sobes.tech IA

Réponse de l'IA

En Kotlin, pour la programmation asynchrone, on utilise des coroutines, et non async/await dans le sens habituel, comme en C# ou JavaScript. Cependant, la bibliothèque kotlinx.coroutines fournit les fonctions async et await, qui implémentent un modèle similaire basé sur les coroutines.

Comment cela fonctionne :

  1. async : C'est une fonction constructeur (extension de CoroutineScope) qui lance une nouvelle coroutine en parallèle et retourne une valeur différée de type Deferred<T>. Deferred<T> est une sorte de résultat "futur" des calculs, qui n'est pas encore prêt. L'exécution du code après l'appel à async continue immédiatement, sans attendre la fin de l'opération asynchrone.

    // Exemple d'utilisation de async
    val deferredResult = CoroutineScope(Dispatchers.IO).async {
        // Opération asynchrone (par exemple, une requête réseau ou lecture de fichier)
        delay(1000) // Simulation d'un travail long
        "Résultat de l'opération asynchrone"
    }
    
  2. await : C'est une fonction suspendue, appelée sur un objet Deferred<T>. Elle suspend l'exécution de la coroutine en cours jusqu'à ce que l'opération asynchrone lancée avec async se termine et que le résultat soit prêt. await retourne la valeur prête de type T.

    // Exemple d'utilisation de await
    // À l'intérieur d'une fonction suspendue ou d'une coroutine
    val result = deferredResult.await() // Suspend l'exécution jusqu'à obtenir le résultat
    println(result)
    

Points clés :

  • Coroutines : Au cœur de async/await en Kotlin, il y a les coroutines. async crée une nouvelle coroutine, et await suspend la coroutine en cours sans bloquer le thread.
  • Deferred<T> : C'est l'équivalent de Promise en JavaScript ou Task<T> en C#. Il représente un résultat qui sera disponible à l'avenir. Deferred hérite de Job, ce qui permet de gérer le cycle de vie de l'opération asynchrone (annuler, vérifier le statut).
  • Non bloquant : await ne bloque pas le thread dans lequel la coroutine s'exécute. Au lieu de cela, il suspend la coroutine, libérant le thread pour d'autres tâches. Lorsque le résultat de l'opération asynchrone est prêt, la coroutine reprend.
  • Scope : Tant async que launch (une autre fonction constructeur de coroutines) sont des fonctions d'extension de CoroutineScope. Cela signifie qu'elles doivent être lancées dans un certain scope. Le scope gère le cycle de vie des coroutines qu'il contient.
  • Gestion des exceptions : Les exceptions survenant dans une coroutine lancée via async sont stockées dans l'objet Deferred et seront levées lors de l'appel à await.

Comparaison avec launch :

Aspect launch async
Type de retour Job Deferred<T> (hérite de Job)
Objectif "Lancer et oublier" (effets secondaires) Obtenir un résultat
Attend la fin Non (sauf si tu utilises join()) Oui (lors de l'utilisation de await())
Exemple d'utilisation Mise à jour de l'UI Effectuer une requête réseau et traiter la réponse

async et await en Kotlin permettent d'écrire du code asynchrone de manière séquentielle, le rendant plus lisible et compréhensible, tout en utilisant les avantages des opérations non bloquantes.