Gibt es eine Möglichkeit, Multithreading in JavaScript durchzuführen?
javascript
multithreading
Niyaz
quelle
quelle
Antworten:
Unter http://caniuse.com/#search=worker finden Sie die aktuellsten Supportinformationen.
Das Folgende war der Stand der Unterstützung um 2009.
Die Wörter, nach denen Sie googeln möchten, sind JavaScript Worker Threads
Abgesehen von Gears ist derzeit nichts verfügbar, aber es wird viel darüber gesprochen, wie dies implementiert werden kann. Ich denke, Sie sollten sich diese Frage ansehen, da sich die Antwort zweifellos in Zukunft ändern wird.
Hier ist die relevante Dokumentation für Gears: WorkerPool API
WHATWG hat einen Empfehlungsentwurf für Worker-Threads: Web Workers
Und es gibt auch Mozillas DOM Worker Threads
Update: Juni 2009, aktueller Stand der Browserunterstützung für JavaScript-Threads
Firefox 3.5 hat Web-Worker. Einige Demos von Web-Workern, wenn Sie sie in Aktion sehen möchten:
Das Gears-Plugin kann auch in Firefox installiert werden.
Safari 4 und die WebKit-Nightlies haben Arbeitsthreads :
In Chrome ist Gears integriert, sodass Threads ausgeführt werden können, obwohl eine Bestätigungsaufforderung des Benutzers erforderlich ist (und eine andere API als bei Web-Workern verwendet wird, obwohl dies in jedem Browser mit installiertem Gears-Plugin funktioniert):
IE8 und IE9 können nur Threads mit dem installierten Gears-Plugin ausführen
quelle
Verschiedene Möglichkeiten, Multithreading und Asynchron in JavaScript durchzuführen
Vor HTML5 erlaubte JavaScript nur die Ausführung eines Threads pro Seite.
Es gab einig hacky Weg , um eine asynchrone Ausführung mit simulieren Yield ,
setTimeout()
,setInterval()
,XMLHttpRequest
oder Event - Handler (siehe Ende dieses Beitrags für ein Beispiel mit Ertrag undsetTimeout()
).Mit HTML5 können wir jetzt Worker-Threads verwenden, um die Ausführung von Funktionen zu parallelisieren. Hier ist ein Anwendungsbeispiel.
Echtes Multithreading
Multithreading: JavaScript Worker-Threads
HTML5 führte Web Worker-Threads ein (siehe: Browserkompatibilität )
Hinweis: IE9 und frühere Versionen unterstützen dies nicht.
Diese Arbeitsthreads sind JavaScript-Threads, die im Hintergrund ausgeführt werden, ohne die Leistung der Seite zu beeinträchtigen. Weitere Informationen zu Web Worker finden Sie in der Dokumentation oder in diesem Lernprogramm .
Hier ist ein einfaches Beispiel mit 3 Web Worker-Threads, die bis MAX_VALUE zählen und den aktuell berechneten Wert auf unserer Seite anzeigen:
Wir können sehen, dass die drei Threads gleichzeitig ausgeführt werden und ihren aktuellen Wert auf der Seite drucken. Sie frieren die Seite nicht ein, da sie im Hintergrund mit getrennten Threads ausgeführt werden.
Multithreading: mit mehreren Iframes
Eine andere Möglichkeit, dies zu erreichen, besteht darin, mehrere Iframes zu verwenden , von denen jeder einen Thread ausführt. Wir können dem Iframe einige Parameter über die URL geben und der Iframe kann mit seinem Elternteil kommunizieren, um das Ergebnis zu erhalten und es zurückzudrucken (der Iframe muss sich in derselben Domäne befinden).
Dieses Beispiel funktioniert nicht in allen Browsern! iframes werden normalerweise im selben Thread / Prozess wie die Hauptseite ausgeführt (Firefox und Chromium scheinen jedoch unterschiedlich damit umzugehen ).
Da das Code-Snippet nicht mehrere HTML-Dateien unterstützt, werde ich hier nur die verschiedenen Codes bereitstellen:
index.html:
thread.html:
Multithreading simulieren
Single-Thread: Emulieren Sie die JavaScript-Parallelität mit setTimeout ()
Der "naive" Weg wäre, die Funktion
setTimeout()
nacheinander wie folgt auszuführen :Diese Methode funktioniert jedoch nicht, da jede Aufgabe nacheinander ausgeführt wird.
Wir können die asynchrone Ausführung simulieren, indem wir die Funktion rekursiv wie folgt aufrufen:
Wie Sie sehen können, ist diese zweite Methode sehr langsam und friert den Browser ein, da der Hauptthread zum Ausführen der Funktionen verwendet wird.
Single-Thread: Emulieren Sie die JavaScript-Parallelität mit Yield
Die Ausbeute ist ein neues Feature in ECMAScript 6 , es funktioniert nur auf der ältesten Version von Firefox und Chrome (in Chrome müssen Sie aktivieren Experimental JavaScript erscheint in chrome: // flags / # enable-Javascript-Harmonie ).
Mit einem Generator können Sie die Ausführung einer Funktion unterbrechen und später fortsetzen. Ein Generator kann verwendet werden, um Ihre Funktionen mit einer Technik namens Trampolin zu planen .
Hier ist das Beispiel:
quelle
Mit den HTML5 "Side-Specs" müssen Sie kein Javascript mehr mit setTimeout (), setInterval () usw. hacken .
HTML5 & Friends führt die Javascript Web Workers- Spezifikation ein. Es ist eine API zum asynchronen und unabhängigen Ausführen von Skripten.
Links zur Spezifikation und ein Tutorial .
quelle
In JavaScript gibt es kein echtes Threading. Da JavaScript die formbare Sprache ist, können Sie einige davon emulieren. Hier ist ein Beispiel, das mir neulich begegnet ist.
quelle
In Javascript gibt es kein echtes Multithreading, aber Sie können asynchrones Verhalten mit
setTimeout()
und asynchronen AJAX-Anforderungen erzielen.Was genau versuchst du zu erreichen?
quelle
Hier ist nur eine Möglichkeit, Multithreading in Javascript zu simulieren
Jetzt werde ich 3 Threads erstellen, die die Addition von Zahlen berechnen, Zahlen können mit 13 geteilt werden und Zahlen können mit 3 bis 10000000000 geteilt werden. Und diese 3 Funktionen können nicht gleichzeitig ausgeführt werden, was Parallelität bedeutet. Aber ich werde Ihnen einen Trick zeigen, mit dem diese Funktionen gleichzeitig rekursiv ausgeführt werden: jsFiddle
Dieser Code gehört mir.
Körperteil
Javascript Teil
Ich hoffe dieser Weg wird hilfreich sein.
quelle
Sie können Narrative JavaScript verwenden , einen Compiler, der Ihren Code in eine Zustandsmaschine umwandelt und so das Threading effektiv emuliert. Dazu wird der Sprache ein "nachgebender" Operator (mit '->' bezeichnet) hinzugefügt, mit dem Sie asynchronen Code in einen einzelnen linearen Codeblock schreiben können.
quelle
Die neue v8-Engine, die heute herauskommen soll, unterstützt sie (glaube ich)
quelle
In rohem Javascript können Sie am besten nur die wenigen asynchronen Aufrufe (xmlhttprequest) verwenden, aber das ist kein wirkliches Threading und sehr eingeschränkt. Google Gears fügt dem Browser eine Reihe von APIs hinzu, von denen einige für die Threading-Unterstützung verwendet werden können.
quelle
Wenn Sie kein AJAX-Material verwenden können oder wollen, verwenden Sie einen oder zehn Iframes! ;) Sie können Prozesse in Iframes parallel zur Masterseite ausführen lassen, ohne sich über browserübergreifende vergleichbare Probleme oder Syntaxprobleme mit dot net AJAX usw. Gedanken machen zu müssen, und Sie können das JavaScript der Masterseite (einschließlich des von ihr importierten JavaScript) von einem aufrufen iframe.
Beispiel: Rufen Sie in einem übergeordneten Iframe
egFunction()
das übergeordnete Dokument auf, sobald der Iframe-Inhalt geladen wurde (das ist der asynchrone Teil).Generieren Sie die Iframes auch dynamisch, damit der Haupt-HTML-Code frei von ihnen ist, wenn Sie möchten.
quelle
Eine andere mögliche Methode ist die Verwendung eines Javascript-Interpreters in der Javascript-Umgebung.
Indem Sie mehrere Interpreter erstellen und deren Ausführung über den Hauptthread steuern, können Sie Multithreading simulieren, wobei jeder Thread in einer eigenen Umgebung ausgeführt wird.
Der Ansatz ähnelt dem von Web-Workern, Sie geben dem Interpreter jedoch Zugriff auf die globale Umgebung des Browsers.
Ich habe ein kleines Projekt gemacht, um dies zu demonstrieren .
Eine ausführlichere Erklärung in diesem Blogbeitrag .
quelle
Javascript hat keine Threads, aber wir haben Arbeiter.
Arbeiter sind möglicherweise eine gute Wahl, wenn Sie keine gemeinsam genutzten Objekte benötigen.
Die meisten Browser-Implementierungen verteilen die Worker tatsächlich auf alle Kerne, sodass Sie alle Kerne verwenden können. Eine Demo dazu finden Sie hier .
Ich habe eine Bibliothek namens task.js entwickelt , die dies sehr einfach macht.
Ein Beispiel wäre
quelle
Mit der HTML5- Spezifikation müssen Sie nicht zu viel JS für dasselbe schreiben oder einige Hacks finden.
Eine der in HTML5 eingeführten Funktionen ist Web Workers, bei dem JavaScript unabhängig von anderen Skripten im Hintergrund ausgeführt wird, ohne die Leistung der Seite zu beeinträchtigen.
Es wird in fast allen Browsern unterstützt:
Chrome - 4.0+
IE - 10.0+
Mozilla - 3.5+
Safari - 4.0+
Opera - 11.5+
quelle