Le paradigme concurrent
Les modèles de concurrence des langages et des frameworks : fils d'exécution et pool de threads, promesses, async/await et boucle d'événements, acteurs ; concurrence contre parallélisme et situation de compétition.
- 25 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
Quelques cartes du deck
Concurrence : de quoi s'agit-il ?
Voir la réponse
Structure d'un programme en tâches qui progressent chacune à leur tour et se recouvrent dans le temps, même sur un seul cœur.
C'est une question d'organisation, pas de matériel : un serveur qui sert mille clients sur un seul fil est concurrent, parce qu'il passe à un autre client pendant qu'un premier attend.
Dans quel ordre ce code JavaScript écrit-il ses lettres ?
```javascript
console.log('A');
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
console.log('D');`A D C BA B C DA D B CA C D B
Voir la réponse
A D C BLe code synchrone passe d'abord (A, D). Puis la boucle vide les micro-tâches, dont les rappels de promesse (C), avant de reprendre les minuteries (B), même à 0 ms.
Dans une fonction déclarée …, le mot-clé … suspend la fonction jusqu'à ce que la promesse soit réglée, sans bloquer la boucle d'événements.
Voir la réponse
Dans une fonction déclarée async, le mot-clé await suspend la fonction jusqu'à ce que la promesse soit réglée, sans bloquer la boucle d'événements.
Pendant la suspension, la boucle exécute d'autres tâches ; la fonction reprend à la ligne suivante quand le résultat est prêt. Le code se lit de haut en bas mais ne bloque pas.
Parallélisme : de quoi s'agit-il ?
Voir la réponse
Exécution de plusieurs calculs au même instant, sur plusieurs cœurs ou plusieurs machines.
Il demande du matériel en plus et sert à aller plus vite sur un calcul lourd ; la concurrence sert à bien utiliser les temps d'attente. On peut avoir l'une sans l'autre.
Un serveur Node.js répond bien, sauf quand une requête lance un calcul de cinq secondes : pendant ce temps, toutes les autres requêtes restent sans réponse. Quelle est la solution ?
- Déporter le calcul dans un fil de travail pour libérer la boucle d'événements
- Ajouter await devant le calcul pour qu'il ne bloque plus
- Déclarer le gestionnaire de la route en async
- Augmenter le délai d'attente des clients
Voir la réponse
Déporter le calcul dans un fil de travail pour libérer la boucle d'événements
Le calcul occupe l'unique fil de la boucle : rien d'autre ne passe tant qu'il ne rend pas la main.
awaitn'aide que pour une attente (réseau, disque), pas pour du calcul pur, qui doit s'exécuter ailleurs.