jeudi 3 octobre 2013

Event Loop

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