Tournez manège !
#dartlang #eventloop
L’asynchronisme dans Dart est présent quasiment partout dans le SDK. Une bonne partie des fonctions retournent des futures ou des streams dès que l’on utilise l’I/O, les events du DOM, ou bien encore les Timers. Il est donc nécessaire d’avoir une architecture pour exécuter ces événements en asynchrone, à savoir une boucle d’événements (event loop). L’article suivant décrit sont fonctionnement :
Ce qu’il faut retenir :
→ Cette architecture s’applique à la fois pour les applications qui tourne sur la VM (standalone ou embarquée dans Dartium), que le code compilé en JavaScript par dart2js
→ Le code Dart s’exécute dans un seul Thread (pour exécuter du code en parallèle, cf. les Isolates ou les WebWorkers)
→ Il existe deux fils d’exécution dans la boucle d'évènements
↳ L’event queue qui contient tous les événements extérieurs dont l’I/O, les events du DOM, les Timers, les messages entre Isolates, etc.
↳ La microtask queue qui ne contient pour le moment que des tâches qui viennent du code Dart. Cette queue est nécessaire car le code répondant à un événement a parfois besoin de s’exécuter plus tard mais avant l’événement suivant.
⇒ Donc la microtask queue a priorité sur l’event queue !
Comment ajouter un événement ou une tâche dans ces queues :
→ new Future() et new Future.delayed() ajoutent un event dans l’event queue.
→ runAsync() ajoute une tâche dans la microtask queue
Ce qu’il faut savoir sur les Futures :
→ La fonction passée à la méthode then est exécutée immédiatement après que le Future se termine. Sauf lorsque le Future est déjà terminé, alors une tâche pour exécuter la fonction est ajoutée à la microtask queue.
→ Faire future.then((_) {new Future(...)}) pour lancer le code qui doit suivre en asynchrone, en l’ajoutant dans l’event queue.
Les dernières recommandations :
→ Dans la majorité des cas, préférer ajouter un événement dans l’event queue.
→ Conserver la microtask queue aussi petite que possible pour ne pas squeezer l’event queue.
→ Pour les longs processus, utiliser plutôt les Isolates ou les WebWorkers pour une exécution en parallèle.
Aucun commentaire:
Enregistrer un commentaire