Pourquoi la programmation asynchrone?

Pourquoi la programmation asynchrone?

17 février 2022 0 Par Aschen

Dans la programmation asynchrone, il est possible d’exécuter certains tâches coûteuses comme les appels réseau de manière asynchrone, sans bloquer l’exécution du code.

En effet, si notre programme doit attendre la fin d’une requête HTTP pour continuer à s’exécuter alors il va perdre énormément de temps à ne rien faire.

Pour donner un ordre d’idée, si compresser 1 Ko de données prend 50 minutes alors:

  • lire 1 Mo depuis un SSD prendrait 11 jours
  • envoyer une requête à une API prendrait plus de 3 ans
https://i.imgur.com/k0t1e.png
Concrètement, tout ce qui sort du CPU ou de la RAM prend une éternité.
ttps://gist.github.com/hellerbarde/2843375

La programmation asynchrone permet de déporter ces tâches très lentes en dehors de notre programme principal en attendant d’avoir une réponse pour ne pas perdre du temps à attendre.

Une fois que l’on a le résultat de notre requête (appelons ça une requête, requête réseau, requête de fichier, etc), alors on va pouvoir utiliser ce résultat pour reprendre l’exécution du programme la ou il en était resté.

https://medium.com/from-the-scratch/wtf-is-synchronous-and-asynchronous-1a75afd039df

Ce qu’il faut bien comprendre ici, c’est que pendant que le programme attend le résultat de la requête, il va continuer à exécuter d’autres parties du code pour faire d’autres traitements.

Cela nous amène à l’utilisation la plus fréquente et celle qui améliore le plus les performances: la parallèlisation des requêtes.

Parallèle vs séquentiel

Lorsque l’on a plusieurs requêtes et qu’elles sont indépendantes alors on peut les effectuer en parallèle grâce à la programmation asynchrone.

Cela permet de commencer l’exécution de chaque requêtes, puis d’attendre les résultats.

Cela représente un gain énorme !

Voyons ce que ça donne avec un exemple en Javascript:

// sequential execution
const cities = ['minsk', 'tbilisi', 'colombo'];
const weathers = [];

for (const city of cities) {
  weathers.push(await fetchWeather(name));
}

// parallel execution
const cities = ['minsk', 'tbilisi', 'colombo'];
const promises = [];

for (const city of cities) {
  promises.push(fetchWeather(name));
}

const weathers = await Promise.all(promises);

Image d’entête: Old town and Mother of Georgia, Tbilisi, Georgia – 02/2022