Frage

Ist es eine bewusste Designentscheidung oder ein Problem mit unseren aktuellen Browsern, das in den kommenden Versionen behoben wird?

War es hilfreich?

Lösung

JavaScript unterstützt kein Multithreading, da der JavaScript-Interpreter im Browser ein einzelner Thread (AFAIK) ist.Selbst Google Chrome lässt nicht zu, dass das JavaScript einer einzelnen Webseite gleichzeitig ausgeführt wird, da dies zu massiven Parallelitätsproblemen auf vorhandenen Webseiten führen würde.Chrome trennt lediglich mehrere Komponenten (verschiedene Registerkarten, Plug-Ins usw.) in separate Prozesse, aber ich kann mir nicht vorstellen, dass eine einzelne Seite mehr als einen JavaScript-Thread hat.

Sie können jedoch, wie vorgeschlagen, Folgendes verwenden: setTimeout um eine Art Planung und „falsche“ Parallelität zu ermöglichen.Dies führt dazu, dass der Browser die Kontrolle über den Rendering-Thread zurückerlangt und den bereitgestellten JavaScript-Code startet setTimeout nach der angegebenen Anzahl von Millisekunden.Dies ist sehr nützlich, wenn Sie zulassen möchten, dass das Ansichtsfenster (was Sie sehen) aktualisiert wird, während Sie Vorgänge daran ausführen.Einfach durchschleifen, z.B.Wenn Sie die Koordinaten eingeben und ein Element entsprechend aktualisieren, sehen Sie nur die Start- und Endpositionen und nichts dazwischen.

Wir verwenden eine Abstraktionsbibliothek in JavaScript, die es uns ermöglicht, Prozesse und Threads zu erstellen, die alle von demselben JavaScript-Interpreter verwaltet werden.Dadurch können wir Aktionen auf folgende Weise ausführen:

  • Prozess A, Thread 1
  • Prozess A, Thread 2
  • Prozess B, Thread 1
  • Prozess A, Thread 3
  • Prozess A, Thread 4
  • Prozess B, Thread 2
  • Pausieren Sie Prozess A
  • Prozess B, Thread 3
  • Prozess B, Thread 4
  • Prozess B, Thread 5
  • Starten Sie Prozess A
  • Prozess A, Thread 5

Dies ermöglicht eine Form der Planung und täuscht Parallelität, das Starten und Stoppen von Threads usw. vor, es handelt sich jedoch nicht um echtes Multithreading.Ich glaube nicht, dass es jemals in der Sprache selbst implementiert wird, da echtes Multithreading nur dann sinnvoll ist, wenn der Browser eine einzelne Seite mit mehreren Threads (oder sogar mehr als einem Kern) ausführen kann und die Schwierigkeiten dort viel größer sind als die zusätzlichen Möglichkeiten.

Schauen Sie sich hier die Zukunft von JavaScript an:https://developer.mozilla.org/presentations/xtech2006/javascript/

Andere Tipps

Traditionell war JS für kurze, schnell laufende Codeteile gedacht.Wenn Sie größere Berechnungen durchführen mussten, führten Sie diese auf einem Server durch – die Idee von JS+HTML App das über längere Zeit in Ihrem Browser lief und nicht triviale Dinge tat, war absurd.

Natürlich haben wir das jetzt.Allerdings wird es eine Weile dauern, bis die Browser aufholen – die meisten von ihnen basieren auf einem Single-Thread-Modell, und das zu ändern ist nicht einfach.Google Gears umgeht viele potenzielle Probleme, indem es erfordert, dass die Hintergrundausführung isoliert ist – keine Änderung des DOM (da dies nicht Thread-sicher ist) und kein Zugriff auf vom Hauptthread erstellte Objekte (dito).Dies ist zwar restriktiv, wird aber wahrscheinlich das praktischste Design für die nahe Zukunft sein, sowohl weil es das Design des Browsers vereinfacht, als auch weil es das Risiko verringert, unerfahrenen JS-Programmierern zu erlauben, mit Threads herumzuspielen ...

@marcio:

Warum ist das ein Grund, Multithreading nicht in Javascript zu implementieren?Programmierer können mit den Tools, die ihnen zur Verfügung stehen, tun und lassen, was sie wollen.

Geben wir ihnen also keine Werkzeuge, die so einfach sind Missbrauch dass jede andere Website, die ich öffne, meinen Browser zum Absturz bringt.Eine naive Implementierung würde Sie direkt in das Gebiet führen, das MS während der IE7-Entwicklung so viele Kopfschmerzen bereitet hat:Add-on-Autoren spielten schnell und locker mit dem Threading-Modell, was zu versteckten Fehlern führte, die offensichtlich wurden, als sich Objektlebenszyklen im primären Thread änderten.SCHLECHT.Wenn Sie Multithread-ActiveX-Add-Ons für den IE schreiben, liegt das meiner Meinung nach in der Hand;Das heißt nicht, dass es noch weiter gehen muss.

JavaScript-Multithreading (mit einigen Einschränkungen) ist hier.Google hat Worker für Gears implementiert und Worker werden in HTML5 integriert.Die meisten Browser unterstützen diese Funktion bereits.

Die Thread-Sicherheit der Daten ist gewährleistet, da alle an den/vom Worker übermittelten Daten serialisiert/kopiert werden.

Weitere Informationen finden Sie unter:

http://www.whatwg.org/specs/web-workers/current-work/

http://ejohn.org/blog/web-workers/

Ich kenne die Gründe für diese Entscheidung nicht, aber ich weiß, dass Sie mit setTimeout einige der Vorteile der Multithread-Programmierung simulieren können.Sie können die Illusion erwecken, dass mehrere Prozesse gleichzeitig Dinge tun, obwohl in Wirklichkeit alles in einem Thread geschieht.

Lassen Sie Ihre Funktion einfach ein wenig arbeiten und rufen Sie dann etwas auf wie:

setTimeout(function () {
    ... do the rest of the work...
}, 0);

Und alle anderen Dinge, die erledigt werden müssen (z. B. Aktualisierungen der Benutzeroberfläche, animierte Bilder usw.), werden bei Gelegenheit erledigt.

Multithread.js umschließt Web Worker und ermöglicht einfaches Multithreading in JS.Funktioniert auf allen neuen Browsern, einschließlich iOS Safari.:) :)

Meinen Sie damit, warum die Sprache kein Multithreading unterstützt oder warum JavaScript-Engines in Browsern kein Multithreading unterstützen?

Die Antwort auf die erste Frage lautet: JavaScript im Browser soll in einer Sandbox und maschinen-/betriebssystemunabhängig ausgeführt werden. Das Hinzufügen von Multithreading-Unterstützung würde die Sprache komplizieren und sie zu eng an das Betriebssystem binden.

Wie Matt B sagte, ist die Frage nicht ganz klar.Angenommen, Sie fragen nach Multithreading-Unterstützung in der Sprache:weil es für 99,999 % der Anwendungen, die derzeit im Browser ausgeführt werden, nicht benötigt wird.Wenn Sie es wirklich brauchen, gibt es Problemumgehungen (z. B. die Verwendung von window.setTimeout).

Im Allgemeinen ist Multithreading sehr, sehr, sehr, sehr, sehr, sehr schwierig (habe ich schon gesagt, dass es schwierig ist?), es sei denn, Sie führen zusätzliche Einschränkungen ein (z. B. nur die Verwendung unveränderlicher Daten).

Intel hat einige Open-Source-Forschungen zum Thema Multithreading in Javascript durchgeführt und diese kürzlich auf der GDC 2012 vorgestellt.Hier ist der Link dazu Video.Die Forschungsgruppe verwendete OpenCL, das sich hauptsächlich auf Intel-Chipsätze und Windows-Betriebssysteme konzentriert.Das Projekt trägt den Codenamen RiverTrail und der Code ist auf GitHub verfügbar

Einige weitere nützliche Links:

Aufbau einer Computing-Autobahn für Webanwendungen

Derzeit unterstützen einige Browser Multithreading.Wenn Sie dies benötigen, können Sie bestimmte Bibliotheken verwenden.Sehen Sie sich zum Beispiel die nächsten Materialien an:

Node.js 10.5+ unterstützt Arbeitsthreads als experimentelle Funktion (Sie können es mit verwenden). --experimental-worker Flag aktiviert): https://nodejs.org/api/worker_threads.html

Die Regel lautet also:

  • wenn Sie es tun müssen I/O-gebundene Operationen, dann verwenden Sie den internen Mechanismus (auch bekannt als Callback/Promise/Async-await).
  • wenn Sie es tun müssen CPU-gebundene Operationen, dann verwenden Sie Arbeitsthreads.

Arbeitsthreads sollen langlebige Threads sein, das heißt, Sie erzeugen einen Hintergrundthread und kommunizieren dann über Message Passing mit ihm.

Andernfalls können Sie mit einer anonymen Funktion fortfahren, wenn Sie eine hohe CPU-Last ausführen müssen https://github.com/wilk/microjob, eine kleine Bibliothek, die um Arbeitsthreads herum aufgebaut ist.

Es sind die Implementierungen, die kein Multithreading unterstützen.Derzeit bietet Google Gears eine Möglichkeit, durch die Ausführung externer Prozesse eine Form der Parallelität zu nutzen, aber das ist auch schon alles.

Der neue Browser, den Google heute veröffentlichen soll (Google Chrome), führt einen Teil des Codes parallel aus, indem er ihn im Prozess trennt.

Die Kernsprache kann natürlich die gleiche Unterstützung haben wie beispielsweise Java, aber eine Unterstützung für so etwas wie Erlangs Parallelität ist noch lange nicht in Sicht.

Soweit ich gehört habe, wird Google Chrome über Multithread-Javascript verfügen, es handelt sich also um ein Problem mit „aktuellen Implementierungen“.

Entsprechend Dieser Artikel Es ist bereits möglich, JavaScript-Threading zu implementieren.

Ohne geeignete Sprachunterstützung für die Thread-Synchronisierung macht es keinen Sinn, neue Implementierungen auszuprobieren.Bestehende komplexe JS-Apps (z. B.alles, was ExtJS verwendet) würde höchstwahrscheinlich unerwartet abstürzen, aber ohne a synchronized Schlüsselwort oder etwas Ähnliches wäre es auch sehr schwierig oder sogar unmöglich, neue Programme zu schreiben, die sich korrekt verhalten.

Sie können jedoch die Funktion „eval“ verwenden, um die Parallelität in gewissem Maße zu verbessern

/* content of the threads to be run */
var threads = [
        [
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');"
        ],
        [
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');"
        ]
    ];

window.onload = function() {
    var lines = 0, quantum = 3, max = 0;

    /* get the longer thread length */
    for(var i=0; i<threads.length; i++) {
        if(max < threads[i].length) {
            max = threads[i].length;
        }
    }

    /* execute them */
    while(lines < max) {
        for(var i=0; i<threads.length; i++) {
            for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) {
                eval(threads[i][j]);
            }
        }
        lines += quantum;
    }
}

Sie können Jetworker und Wrapper für Webworker verwendenhttps://github.com/uxitten/jetworker

Multithreading mit Javascript ist mit Webworkern von HTML5 eindeutig möglich.

Der Hauptunterschied zwischen Webworkern und einer Standard-Multithreading-Umgebung besteht darin, dass Speicherressourcen nicht mit dem Hauptthread geteilt werden und ein Verweis auf ein Objekt von einem Thread zum anderen nicht sichtbar ist.Threads kommunizieren durch den Austausch von Nachrichten. Daher ist es möglich, einen Algorithmus für Synchronisierung und gleichzeitigen Methodenaufruf zu implementieren, der einem ereignisgesteuerten Entwurfsmuster folgt.

Es gibt viele Frameworks, die es ermöglichen, die Programmierung zwischen Threads zu strukturieren, darunter OODK-JS, ein OOP-JS-Framework, das gleichzeitige Programmierung unterstützthttps://github.com/GOMServices/oodk-js-oop-for-js

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top