JavaScript Multi Threading

10

Nun, heutzutage ist JavaScript der Hauptakteur in allen Webentwicklungstechnologien, auf der Clientseite zur Verbesserung der Benutzeroberfläche, der clientseitigen Logik, auf einigen Webservern auch als serverseitige Logik

Hinzu kommt, dass die Leute (zumindest einige von ihnen) in der Entwicklung von Webspielen von Flash zu Javascript und HTML5 übergingen

Ist es nicht an der Zeit, Multithreading zu unterstützen? Gibt es Browser, die das Multithreading von JavaScript ermöglichen, oder gibt es sie in Standards, HTML5 oder zukünftigen Versionen ?!

Ali
quelle
1
Die Leute machen keine Dinge, die nicht benötigt werden. Menschen, die zum Design von Javascript beigetragen haben, sind auch diejenigen, die mit der Entwicklung von Webservern und Browsern zu tun haben, damit sie davon wissen. Es geht nur um Nützlichkeit.
Dipan Mehta

Antworten:

9

Multithreading wird nicht in EcmaScript durchgeführt, kann jedoch in Hostumgebungen verfügbar gemacht werden.

Die klassischen Beispiele sind WebWorker, mit denen Sie einen Background-Worker für die Arbeit und den Missbrauch von <iframe>'s' starten können , um neue Prozesse hervorzubringen .

Es ist zu beachten, dass Multithreading in JavaScript nicht erforderlich ist (es gibt Ausnahmen, hauptsächlich grafikbezogene Programme). Sie benötigen nicht mehrere Threads, Sie haben bereits eine Ereignisschleife für Ihre GUI und Ihr Grafik-Rendering (Canvas) ist hardwarebeschleunigt (dh die GPU rendert Ihre Grafiken parallel für Sie).

Obwohl Projekte wie webcl ziemlich aufregend sind.

Raynos
quelle
2
Können Sie die Tatsache erweitern, dass es "nicht benötigt wird"? Ich bin kürzlich auf eine Instanz gestoßen, in der der natürliche Fall bei der Desktop-Programmierung darin bestand, einen Thread zu erstellen, um die Aufgabe zu erledigen, aber das war offensichtlich keine einfache oder Standardoption. Ich habe diesen Fall umgangen, aber das Laichen eines Fadens schien die elegantere Lösung zu sein.
Rig
@rig was war der Fall, mit dem Sie umgehen wollten?
Zachary K
@ Rig geben ein konkretes Beispiel. Eine rechenintensive Verarbeitung ist in clientseitigem JavaScript selten
Raynos
@ Raynos, bitte erkläre mehr darüber, wie es nicht benötigt wird. Ich denke nur nicht sicher, ob in der Spieleentwicklung, wenn zum Beispiel umfangreiche Berechnungen in Bezug auf Grafik, Physik und Logik durchgeführt werden, die Framerate leicht beeinflusst wird, wenn kein Multithreading vorhanden ist
Ali
@Ali Ich habe aufgehört und gesagt, es gibt Ausnahmen. Der größte Teil dieser umfangreichen Berechnung sollte jedoch der GPU über die hardwarebeschleunigte Grafik-API übertragen werden
Raynos
4

NEIN

Multithreading ist eines der schwierigsten Dinge in der Software, um es richtig zu machen. Es gibt viel zu viele Eckfälle, die wirklich schwer zu lösen sind, wenn Ihr Code nicht deterministisch ist. (Ich spreche von Multithreading mit Sperren usw.). Darüber hinaus basieren alle verschiedenen JavaScript-Bibliotheken auf der Annahme, dass es sich nicht um Multithreading handelt.

Davon abgesehen gibt es Web-Worker, die Ihnen ein akteursbasiertes Framework für die Ausführung von Operationen mit mehreren Verarbeitungsarten bieten. Sie können Mitarbeiter erstellen und Daten über Ereignisse hin und her übertragen.

BEARBEITEN: Der andere Grund ist, dass JavaScript bei der Erstellung so erstellt wurde, dass davon ausgegangen wurde, dass es für kleine Aufgaben verwendet wird, sodass keine Parallelität eingebaut wurde. Zum Nachrüsten würde jetzt viel Code beschädigt. Durch das Hinzufügen von Web-Workern war es möglich, ein System zu haben, in dem es Parallelität ohne gemeinsamen Speicher gibt, aber durch die Verwendung von Akteuren ein Modell der Parallelität, das sich in einer Reihe anderer Sprachen wie Erlang, Scala und Clojure als sehr robust erwiesen hat usw.

(WENN Sie nicht sagen können, dass ich sperrenbasierte Parallelität wirklich nicht mag)

Zachary K.
quelle
1
Multi threading is one of the hardest things in software to get right.- Ich bin nur überrascht! Der von Ihnen verwendete Browser, das Betriebssystem Ihres Desktops, der Webserver, der diese Seite bedient - praktisch jede Anwendung, die Sie täglich verwenden, ist Multithread-fähig. Sind Sie sicher, dass Sie es meinen? Noch um dich herabzustimmen, aber ich werde es tun, wenn du sagstmultithreading is not done because it is hard
Dipan Mehta
3
@ DipanMehta Multithreading ist eines der schwierigsten Dinge in der Software, um es richtig zu machen. Der Grund, warum all diese Anwendungen es verwenden, ist, dass sie von wirklich talentierten Leuten geschrieben wurden
Raynos
@ Raynos - meine Güte! Du nennst mich also talentiert! Ich benutze es jeden Tag ... ich denke, wenn Sie C-Programmierung oder eine große Anwendung sind, ist es ziemlich häufig. Der Punkt ist, dass das W3C-Konsortium es unabhängig von Verwendung und Anforderung nicht wirklich für Javascript verschont hat, weil es zu schwierig war !
Dipan Mehta
2
Sie verstehen sehr genau, wie schwierig es ist, korrekte und effiziente Parallelprogramme zu schreiben. Aber Multithreading ist nicht in JavaScript, weil es unnötig
komplex ist
2
@DipanMehta Es ist ein schwieriges Problem, eine sperrbasierte Parallelität richtig zu machen und alle Eckfälle zu lösen. Zum Beispiel wäre eine Implementierung von etwas so Einfachem wie einer Warteschlange mit Sperren, die sich in allen Fällen als richtig erweisen kann, bis vor einigen Jahren ein publizierbares Ergebnis gewesen. Noch wichtiger ist jedoch, dass der Versuch, dies auf eine Sprache nachzurüsten, die es nicht gab, um Ärger bittet.
Zachary K
3

Das Öffnen von Javascript für Multithreading führt zu mehr Problemen als es löst:

Die aktuelle Architektur ist ereignisbasiert mit einem Thread (wird häufig im GUI-Thread ausgeführt). Mit anderen Worten, Sie können sicher sein, dass sich mit jedem Codeblock von Anfang bis Ende nichts in der Umgebung ändert, außer was geändert wird im Code.

Sobald Sie die Preemption oder parallele Ausführung zulassen, ist diese Funktion nicht mehr verfügbar. Dies bedeutet, dass Sie Sperren auf Daten anwenden müssen, die Sie mutieren möchten, und dass Sie die gesamten schwer zu debuggenden Race-Bedingungen vermeiden müssen

Es ist möglich, eine pseudo-parallele Ausführung mit Zeitüberschreitungen durchzuführen. Dies bedeutet, dass große oder lange laufende Funktionen in atomare Blöcke aufgeteilt und verwendet werden, setTimeout(function(){nextstep(args);},1);damit bei Bedarf andere Dinge ausgeführt werden können

Ratschenfreak
quelle
0

Intel hat vor einiger Zeit River Trail veröffentlicht , das die parallele Programmierung in Javascript ermöglicht. Es ist jedoch nur ein Firefox-Plugin und ich habe noch nichts von einer Roadmap gehört, die diese Technologie in W3C bringt, geschweige denn in ECMA.

Demian Brecht
quelle