event loop

Dart asynchrone : hello event loop

Si vous travaillez avec Dart ou même Javascript, vous DEVEZ connaître l’event loop, ou en Français : la boucle d’événements. C’est ce qui rend Dart ou Javascript asynchrone. Les deux sont des langages à thread unique, cela signifie qu’ils n’utilisent qu’un seul thread et sont en fait des langages synchrones.

Je vous entends d’ici : «Attends, quoi? Dart est un langage mono-thread? ». En fait, Dart fournit des isolates (= isolats? Je ne suis pas sure que cela se dise, mais ça fera l’affaire !). Ces isolats sont une sorte de multithreading « façon Dart ». Enfin… oui et non. Mais nous en parlerons plus tard, plongeons d’abord dans le concept de boucle d’événements, en supposant donc que nous exécutons notre code Dart dans l’isolat principal, mono-thread donc, si vous suivez bien.

En tant que bon langage mono thread, Dart n’exécute qu’une seule opération à la fois. Cela signifie que tant qu’il exécute quelque chose, les prochaines opérations entrant dans la file d’attente doivent attendre la fin de sa tâche en cours. Ainsi, lorsque Dart exécute une longue tâche, il peut éventuellement bloquer le thread, gelant ainsi l’application qui ne répondra plus aux interactions des utilisateurs tant que Dart n’aura pas terminé l’exécution de sa longue tache. Le genre de situation un peu ennuyeux.

Les files d’attente et la boucle

Dans cet isolat mono thread, Dart fournit 2 files d’attente: une pour les micro tâches, une autre pour les événements. La boucle d’événements est une sorte de boucle infinie qui s’exécute durant tout le runtime pour surveiller les files d’attente de micro tâches et d’événements. Les deux files d’attente sont FIFO (first in, first out), donc la première chose à entrer dans la file d’attente sera la première à en sortir.

La boucle d’événement surveille les micro tâches avec une priorité plus élevée. Si la file d’attente de micro tâches n’est pas vide, elle exécute la première micro tâche, puis la suivante jusqu’à ce qu’il n’y ait plus de micro tâches dans la file d’attente. Ensuite, lorsque la file d’attente de micro tâches est vide, elle surveille la file d’attente d’événements et exécute le premier événement. Après avoir exécuté le premier événement, la boucle d’événements regarde à nouveau dans la file d’attente des micro tâches, et si elle est vide, elle traite un autre événement, puis regarde à nouveau les micro tâches, puis les événements, puis les micr… ok vous l’avez? Il s’agit d’une boucle infinie surveillant en priorité les micro tâches, puis les événements. And again.

Ce dont vous devez vous souvenir :

  • Dart est exécuté dans un isolat, qui fournit un seul thread.
  • Ce thread est livré avec sa propre mémoire, un runtime, deux files d’attente FIFO (une pour les micro tâches, une pour les événements) et des éléments relativement utiles comme une boucle d’événements ou un puissant garbage collector.
  • La boucle d’événement surveille les files d’attente pendant tout le runtime.
  • Les micro-tâches ont une priorité plus élevée que les événements.

C’est un peu difficile d’expliquer la boucle de l’événement à l’écrit, mais j’ai trouvé une excellente vidéo qui montre très clairement ce processus et aide beaucoup à comprendre ce qui se passe ici :

J’espère que cela vous permettra de comprendre plus facilement la boucle d’événements, car c’est un concept très important pour les performances de votre application.

Cette conférence de Philip Roberts est l’une des meilleures que j’ai vu sur ce concept d’event loop. Il s’agit d’une conf sur Javascript, mais la boucle d’événements est la même, alors ne soyez pas timide et jetez un œil, c’est vraiment super intéressant :

Dans le prochain post, je vous parlerai des fameux isolats. Restez dans le coin !

Nevae

Hello ! Je suis développeur IoT et UX designer junior. Vit en France, deux marmots, rat de bibliothèque, fille à chat, Flutter addict, bla bla bla. Les trucs habituels. Allez go, on parle de code !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

back to top