web-dev-qa-db-fra.com

Comme JavaScript est mono-thread, comment les travailleurs Web de HTML5 font-ils le multi-thread?

Je lisais des informations sur les travailleurs Web dans HTML5, mais je sais que JavaScript est à thread unique.

Ma question est:

Comment les travailleurs Web effectuent-ils un travail multithread alors? ou comment le simulent-ils si ce n'est pas vraiment multithread? Cela ne me semble pas clair ici.

47
James Drinkard

Comme plusieurs commentaires l'ont déjà souligné, les travailleurs sont vraiment multithreads.

Quelques points qui peuvent aider à clarifier votre pensée:

  • JavaScript est un langage, il ne définit pas de modèle de thread, il n'est pas nécessairement à un seul thread.
  • La plupart des navigateurs ont toujours été dotés d'un seul thread (bien que cela change rapidement: C'EST-À-DIRE , Chrome , Firefox ), et la plupart des implémentations JavaScript se produisent dans les navigateurs.
  • Les travailleurs Web ne font pas partie de JavaScript, ils constituent une fonctionnalité de navigateur accessible via JavaScript.
54
robertc

Vous créez un fichier .js en tant que "travailleur" et les processus sont exécutés dans un thread séparé. Vous pouvez transmettre des données JSON entre celui-ci et le fil "principal". Les travailleurs n’ont cependant pas accès à certaines choses comme le DOM. 

Donc, si, par exemple, vous vouliez résoudre des problèmes mathématiques complexes, vous pouvez laisser l'utilisateur saisir des éléments dans le navigateur, transmettre ces variables au travailleur, le laisser faire le calcul en arrière-plan, tandis que dans le fil principal, laisser l'utilisateur le faire. afficher une barre de progression ou autre chose, puis lorsque le travailleur a terminé, il renvoie la réponse et vous l'imprimez sur la page. Vous pouvez même résoudre plusieurs problèmes de manière asynchrone et renvoyer les réponses dans le désordre à la fin. Génial!

5
JKing

Le navigateur lance un fil avec le javascript que vous voulez exécuter. C'est donc un vrai fil, avec ce truc web workers, votre js n'est plus mono-thread.

0
rapadura