Web WorkerWeb Worker führen JavaScript Code getrennt vom Hauptthread im Hintergrund aus. Web Worker gibt es in drei Typen: Dedicated Workers, Shared Workers und Service Workers. Dedicated WorkersDer gewöhnliche Web Worker nennt sich Dedicated Worker. Problem![]() Immer länger werdende JavaScript-Skripte führten Browsern nur in einem einzigen Thread im Vordergrund aus. Dies führte zunehmend zu Problemen, je umfangreicher aufwändiger Code verarbeitet werden soll, da dieser sehr lange läuft und damit in der Zwischenzeit die Interaktion des Benutzers mit der Internetseite sehr erschwert oder ganz unmöglich macht. Dagegen bieten die meisten Browser eine Möglichkeit ein viel zu lange laufendes Skript abzubrechen. In diesem Fall wird der Browser bis zum Zeitlimit durch die Skripte blockiert, wenn diese eine zu komplexe und damit sehr rechenintensive Aufgabe abarbeiten. Um diese Behinderungen zu umgehen, wurde die Web-Worker-API entwickelt.[1] Web-Worker-APIÜber Innerhalb des Workers stehen alle JavaScript-Funktionen zur Verfügung, die im ECMAScript-Standard definiert sind, ebenso viele der browsertypischen APIs. Eine wichtige Ausnahme hiervon ist das Document Object Model. Der Worker-Code hat hierauf keinen Zugriff und muss zum Verändern der Seite daher dem Hauptthread eine Nachricht schicken, damit dieser die gewünschten Befehle ausführt. VariablenübergabeÜber Binäre Daten können als Während DOM-Elemente nicht an einen anderen Thread übergeben werden können, soll dies für Canvas-Elemente bis zu einem gewissen Maß möglich gemacht werden. Der Hauptthread kann über ein BeispielDas folgende Beispiel sucht nach Primzahlen. Diese werden der Reihe nach in einem Worker berechnet und dem Hauptthread zur Anzeige übergeben.[4] Das HTML-Dokument bettet dabei direkt das Hauptskript ein. Dieses erstellt einen Worker und reagiert anschließend auf Mitteilungen, die dieser Worker sendet. <!DOCTYPE html>
<html>
<head>
<title>Worker-Beispiel</title>
</head>
<body>
<p>Die bis jetzt größte gefundene Primzahl ist: <output id="result"></output></p>
<script>
var worker = new Worker( 'worker.js' ); // erzeugt neuen Worker
worker.onmessage = function ( event ) { // wird aufgerufen, wenn Worker eine Nachricht sendet
document.getElementById( 'result' ).textContent = event.data; // zeigt die gefundene Primzahl an
};
</script>
</body>
</html>
Der Code für das Skript var i, n = 1;
search: while ( true ) {
n++;
for ( i = 2; i <= Math.sqrt( n ); i++ ) {
if ( n % i === 0 ) {
continue search;
}
}
// n ist eine Primzahl
postMessage( n );
}
Shared WorkerEin gewöhnlicher Worker gehört immer zu der Seite, die ihn erzeugt hat. Ruft ein Benutzer die Seite mehrfach in seinem Browser auf (oder verschiedene Seiten derselben Domain, die den gleichen Worker einsetzen), so werden mehrere Worker mit dem gleichen Code initialisiert. Setzt man stattdessen einen Service WorkerEine weitere besondere Art eines Web Workers ist der Service Worker. Dieser wird für zwei Aufgaben eingesetzt: Zum einen kann er als Proxy fungieren, zum anderen vom Server gesendete Benachrichtigungen selbst dann empfangen, wenn gerade keine Seite der entsprechenden Domain geöffnet ist.[5] Für die Aufgabe als Proxy steht im Worker das BrowserunterstützungBrowser wie Google Chrome ab der Version 4, Mozilla Firefox ab Version 3.5, der Internet Explorer ab Version 10, Edge ab Version 12 boten grundlegende Unterstützung für Web Worker.[8] Die Unterstützung wurde und wird mit neueren Versionen immer weiter ausgebaut. Service Worker waren mit Chrome ab Version 40, in Firefox ab Version 44 noch nicht im kompletten Umfang implementiert.[9] Normen und StandardsWeb Workers ist standardisiert vom W3C. Die aktuelle Spezifikation stammt vom 24. September 2015.
Weblinks
Einzelnachweise
|