Web workers

Alexandre Niveau
GREYC — Université de Caen

JS et les threads

  • Historiquement, JS est un langage monothread
  • Très ennuyeux quand on veut faire des choses un peu lourdes en calcul : l'interface utilisateur devient inutilisable
  • Opérations asynchrones, mais ne permettent pas vraiment la concurrence

Web workers

  • Permettent le multithreading, avec un modèle de passage de messages
    • NB: les navigateurs sont libres d'implémenter les workers avec des processus et pas des threads -> prudence
  • Ont un accès limité à certaines choses
    • sont dans un contexte spécial, le DedicatedWorkerGlobalScope, accessible avec le mot-clef self
    • pas d'accès à window, pas de modification du DOM possible
    • c'est le script principal qui s'occupe des relations avec l'« extérieur »
  • Objectifs : efficacité, les workers sont au maximum indépendants
    • pas de risque de modification concurrente du DOM

Passage de messages

  • envoi se fait avec postMessage (sur le worker, ou sur self dans le worker)
  • le worker et le script principal peuvent s'abonner aux MessageEvent, qui ont un attribut data
  • le contenu des messages est copié. Attention aux gros objets JSON par exemple

Objets transférables

  • On a souvent besoin de passer des gros objets aux workers, typiquement des données binaires
  • Ennuyeux de devoir les copier
  • On peut utiliser la transférabilité : l'objet est passé directement au worker, mais il n'est plus accessible à l'appelant (donc les problèmes sont évités)
  • Pour passer un objet par transfert, argument optionnel de Worker.postMessage contient la liste des objets devant être transférés
  • ArrayBuffer est transférable, mais pas les Typed Arrays par exemple
  • présenter l'exemple du calcul de l'octet moyen ?…
  • fibo avec un timeout, mais c'est nul…
  • attention au cache !