Pourquoi ne pas JavaScript support de multithreading?
Est-ce une volonté délibérée de décision de conception ou d'un problème de nos jours les navigateurs qui sera corrigé dans les prochaines versions?
- Voir aussi les réponses à la JavaScript et les Threads question pour plus d'informations sur le web les travailleurs/threads de travail.
- Bonjour, camarade Googleurs. Vous remarquerez peut-être que tout ici semble être assez daté (notez que cette question a été posée à plus de 5 ans.) Depuis, il a été demandé, les navigateurs web ont acquis certaines capacités que, autant que je puisse en juger, sont plus ou moins multithreading. Jetez un oeil à des Web workers: msdn.microsoft.com/en-us/hh549259.aspx
- Double Possible de JavaScript et les Threads
Vous devez vous connecter pour publier un commentaire.
JavaScript ne prend pas en charge le multi-threading, car l'interpréteur JavaScript dans le navigateur est un seul thread (autant que je sache). Même Google Chrome ne va pas laisser une seule page web du JavaScript exécuté simultanément parce que ce serait la source de graves problèmes de concurrence dans les pages web existantes. Tous Chrome n'est séparée des composants multiples (différents onglets, plugins, etc...) dans des processus séparés, mais je ne peux pas imaginer une seule page ayant plus d'un JavaScript fil.
Vous pouvez cependant utiliser, comme on l'a suggéré,
setTimeout
pour permettre à certains de tri de la planification et de “faux” de la simultanéité. Cela provoque le navigateur de reprendre le contrôle de la thread de rendu, et de commencer le code JavaScript fourni àsetTimeout
après le nombre de millisecondes. Ceci est très utile si vous souhaitez autoriser la fenêtre d'affichage (ce que vous voyez) pour actualiser lors de l'exécution d'opérations sur elle. Juste en boucle par exemple, au moyen des coordonnées et de la mise à jour d'un élément en conséquence va simplement vous permettre de voir le début et la fin de positions, et rien entre les deux.Nous utilisons une abstraction bibliothèque JavaScript qui permet de créer des processus et des threads qui sont tous gérés par le même interpréteur JavaScript. Cela nous permet d'exécuter des actions de la manière suivante:
Cela permet une certaine forme de planification et de faux parallélisme, le démarrage et l'arrêt des threads, etc, mais il ne sera pas le cas de multi-threading. Je ne pense pas que cela puisse être mis en œuvre dans la langue elle-même, puisque le vrai multi-threading n'est utile que si le navigateur peut exécuter une seule page multi-thread (ou même plus d'un noyau), et les difficultés sont beaucoup plus grands que les possibilités supplémentaires.
Pour l'avenir de JavaScript, check this out:
https://developer.mozilla.org/presentations/xtech2006/javascript/
Traditionnellement, JS a été prévu pour faire court, rapide à l'exécution de morceaux de code. Si vous avez eu des calculs de passe, vous l'avez fait sur un serveur - l'idée d'un JS+HTML application qui courait dans votre navigateur pour de longues périodes de temps non négligeable des choses est absurde.
Bien sûr, maintenant que nous avons que la. Mais, il va prendre un peu de navigateurs pour rattraper la plupart d'entre eux ont été conçus autour d'un seul modèle de thread, et l'évolution qui n'est pas facile. Google Gears côté-étapes a beaucoup de problèmes potentiels en exigeant que l'exécution en arrière-plan est isolé - pas de changement dans les DOM (puisque ce n'est pas thread-safe), pas d'accès aux objets créés par le thread principal (idem). Bien que restrictive, ce sera probablement la plus pratique de conception pour le proche avenir, à la fois parce qu'il simplifie la conception du navigateur, et parce qu'il réduit le risque impliqué dans permettre inexpérimenté JS codeurs de déconner avec des fils...
@marcio:
Alors, il ne faut pas leur donner des outils qui sont si faciles à abus que tous les autres site que j'ai ouvert finit par planter mon navigateur. Une implémentation naïve de ce serait vous apporter directement dans le territoire qui a causé MME si beaucoup de maux de tête pendant IE7 développement: ajouter-sur les auteurs joué rapide et lâche avec le modèle de thread, résultant dans la face cachée des bogues qui est devenu évident lorsque l'objet de cycle de vie a changé sur le thread principal. MAUVAIS. Si vous êtes à la rédaction multi-thread ActiveX add-ons pour IE, je suppose que cela vient avec le territoire; ne signifie pas qu'il doit aller plus loin que cela.
JavaScript multi-threading (avec certaines limitations) est ici. Google mis en œuvre travailleurs pour Engrenages, et les travailleurs sont inclus avec le HTML5. La plupart des navigateurs ont déjà ajouté le support de cette fonctionnalité.
Fil-sécurité des données est garantie puisque toutes les données communiquées à/de la travailleur est sérialisé/copié.
Pour plus d'info, lire:
http://www.whatwg.org/specs/web-workers/current-work/
http://ejohn.org/blog/web-workers/
Je ne sais pas la raison de cette décision, mais je sais que vous pouvez simuler certains des avantages de la multi-thread programmation à l'aide de setTimeout. Vous pouvez donner l'illusion de plusieurs des processus de faire les choses en même temps, mais dans la réalité, tout se passe dans un thread.
Juste avoir votre fonction de faire un peu de travail, et ensuite appeler quelque chose comme:
Et toutes les autres choses qui ont besoin de faire (comme l'INTERFACE utilisateur des mises à jour, des images animées, etc) qui va se passer quand ils obtiennent une chance.
loop
à l'intérieur de lasetTimeout
mais apparemment cela ne fonctionne pas. Avez-vous fait quelque chose comme ça, ou vous avez un hack? un exemple de tableau de 1000 élément, je m'attends à utiliser deux boucles for intérieur de deuxsetTimeout
appels tels que la première boucle et d'impression élément0..499
, la deuxième boucle et d'impression élément500..999
.Multithread.js enveloppements Web des Travailleurs et permet de faciliter le multithreading en JS. Fonctionne sur tous les navigateurs, y compris iOS Safari. 🙂
Voulez-vous dire pourquoi ne pas la langue de support de multithreading ou pourquoi ne pas les moteurs JavaScript dans les navigateurs support de multithreading?
La réponse à la première question, c'est que du JavaScript dans le navigateur est destiné à être exécuté dans un bac à sable et une machine/OS manière indépendante, pour ajouter de la prise en charge du multithreading, ce qui compliquerait la langue et de la cravate et la langue trop près de l'OS.
Tout comme matt b a dit, la question n'est pas très clair. En supposant que vous vous posez sur le multithreading soutien dans la langue: car il n'est pas nécessaire pour 99.999% des applications s'exécutant dans le navigateur. Si vous en avez vraiment besoin, il existe des solutions de contournement (comme l'utilisation de la fenêtre.setTimeout).
En général le multithreading est très, très, très, très, très, très dur (j'ai dit que c'est dur?) pour obtenir le droit, sauf si vous les mettez dans des restrictions supplémentaires (en utilisant seulement les données immuables).
Intel a fait quelques open-source de la recherche sur le multithreading en Javascript, il a été présenté récemment à la GDC 2012.
Voici le lien pour le vidéo. Le groupe de recherche a utilisé OpenCL, qui se concentre principalement sur des jeux de puces Intel et Windows OS. Le projet est le nom de code RiverTrail et le code est disponible sur GitHub
Quelques liens utiles:
La construction d'un Calcul de Route pour les Applications Web
Actuellement, certains navigateurs ne support le multithreading. Donc, si vous avez besoin que vous pourriez utiliser des bibliothèques spécifiques. Par exemple, la vue de la prochaine matériaux:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers
(support des threads d'arrière-plan);
https://keithwhor.github.io/multithread.js/ (la bibliothèque).
Node.js 10.5+ prend en charge threads de travail comme fonctionnalité expérimentale (vous pouvez l'utiliser avec --expérimental-travailleur indicateur activé): https://nodejs.org/api/worker_threads.html
Donc, la règle est la suivante:
Threads de travail sont destinés à être longue vie threads, ce qui signifie que vous frayer un thread d'arrière-plan et puis vous communiquer avec lui via la transmission de message.
Sinon, si vous avez besoin d'exécuter une lourde charge CPU avec une fonction anonyme, alors vous pouvez aller avec https://github.com/wilk/microjob, une petite bibliothèque construite autour de threads de travail.
C'est l'implémentation qui ne prend pas en charge le multi-threading. Actuellement, Google Gears est de fournir un moyen d'utiliser une certaine forme de concurrence d'accès en exécution de processus externe, mais c'est tout.
Le nouveau navigateur de Google est censé communiqué aujourd'hui (Google Chrome) qui permet d'exécuter un code en parallèle en les séparant dans le processus.
Le langage de base, des cours peuvent avoir le même support, comme par exemple Java, mais le soutien pour quelque chose comme Erlang est la simultanéité est nulle part près de l'horizon.
Autant que j'ai entendu de Google Chrome ont multithread javascript, donc c'est un "implémentations actuelles" problème.
Selon cet article il est déjà possible de mettre en œuvre JavaScript threading.
Sans un bon support de la langue pour le fil de synchronisation, il n'a même pas de sens pour les nouvelles mises en œuvre pour essayer. Complexe existant JS applications (par exemple, quelque chose en utilisant ExtJS) serait le plus probable crash de façon inattendue, mais sans
synchronized
mot-clé ou quelque chose de similaire, il serait également très difficile, voire impossible, d'écrire de nouveaux programmes qui se comportent correctement.Cependant, vous pouvez utiliser la fonction eval pour apporter de la simultanéité, dans une CERTAINE MESURE
vous pouvez utiliser jetworker, papier d'emballage sur webworker
https://github.com/uxitten/jetworker
Multi-threading avec javascript est clairement possible, en utilisant les web workers apporter par HTML5.
Principale différence entre les web workers et un standard multi-threading environnement ressources de la mémoire ne sont pas partagées avec le thread principal, une référence à un objet n'est pas visible à partir d'un thread à l'autre. Fils de communiquent par échange de messages, il est donc possible de mettre en œuvre un synchronzization et simultanées de l'appel de la méthode de l'algorithme à la suite d'un event-driven design pattern.
De nombreux frameworks existent permettant à la structure de la programmation entre les threads, parmi eux OODK-JS, une programmation orientée objet js cadre qui soutient la programmation simultanée
https://github.com/GOMServices/oodk-js-oop-for-js