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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. 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 B
    • A B C D
    • A D B C
    • A C D B
    Voir la réponse

    A D C B

    Le 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. await n'aide que pour une attente (réseau, disque), pas pour du calcul pur, qui doit s'exécuter ailleurs.