www.wikidata.de-de.nina.az
Web Worker erlauben es in JavaScript Code getrennt vom Hauptthread im Hintergrund auszufuhren Web Worker gibt es in drei Typen Dedicated Workers Shared Workers und Service Workers Inhaltsverzeichnis 1 Dedicated Workers 1 1 Problem 1 2 Web Worker API 1 3 Variablenubergabe 1 4 Beispiel 2 Shared Worker 3 Service Worker 4 Browserunterstutzung 5 Normen und Standards 6 Weblinks 7 EinzelnachweiseDedicated Workers BearbeitenDer gewohnliche Web Worker nennt sich Dedicated Worker Problem Bearbeiten nbsp Warnmeldung uber ein Skript das so lange braucht dass es nicht mehr zu reagieren scheintTraditionell wurden JavaScript Skripte von Browsern nur in einem einzigen Thread im Vordergrund ausgefuhrt Dies fuhrt zu Problemen wenn aufwandiger Code verarbeitet werden soll da dieser moglicherweise sehr lange lauft und damit in der Zwischenzeit die Interaktion des Benutzers mit der Internetseite erschwert oder ganz unmoglich macht Daher bieten die meisten Browser eine Moglichkeit ein lange laufendes Skript abzubrechen Doch auch in diesem Fall kann der Browser fur kurze Zeit durch ein Skript blockiert werden zudem bereitet das Zeitlimit Skripten ein Problem wenn diese eine komplexe und damit rechenintensive Aufgabe bearbeiten sollen Um diesen Problemen zu begegnen wurde die Web Worker API entwickelt 1 Web Worker API Bearbeiten Uber span class ow new span span class w span span class nx Worker span span class p span span class w span span class s1 skript js span span class w span span class p span kann ein neuer Web Worker eingerichtet werden Der Browser ladt dazu das angegebene Skript in einen neuen Thread Die Kommunikation mit dem Worker kann in beide Richtungen uber die Methode postMessage und den Eventlistener onmessage erfolgen Innerhalb des Workers stehen alle JavaScript Funktionen zur Verfugung 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 Verandern der Seite daher dem Hauptthread eine Nachricht schicken damit dieser die gewunschten Befehle ausfuhrt Variablenubergabe Bearbeiten Uber postMessage konnen Variablen von einfachen Typen ubergeben werden Zahlen Zeichenketten Arrays und einfache Objekte etwas mehr als in JSON moglich ist Anders als bei Ubergaben an Funktionen wird dabei eine Kopie angefertigt die Daten also als Wertparameter und nicht wie sonst ublich als Referenzparameter ubergeben Funktionen und Objekte im Sinne von objektorientiertem Code mussen dagegen fur eine Ubergabe geeignet serialisiert und deserialisiert werden Binare Daten konnen als ArrayBuffer ubergeben werden anschliessend ist aber kein Zugriff mehr auf das Original moglich Alternativ kann ein SharedArrayBuffer verwendet werden der von mehreren Threads gleichzeitig bearbeitet werden kann Hierfur stehen besondere atomare Operationen zur Verfugung 2 Wahrend DOM Elemente nicht an einen anderen Thread ubergeben werden konnen soll dies fur Canvas Elemente bis zu einem gewissen Mass moglich gemacht werden Der Hauptthread kann uber ein OffscreenCanvas Element die Kontrolle an einen Hintergrundthread abgeben dort konnen alle ublichen Funktionen zum Zeichnen aufgerufen werden 3 Beispiel Bearbeiten Das folgende Beispiel sucht nach Primzahlen Diese werden der Reihe nach in einem Worker berechnet und dem Hauptthread zur Anzeige ubergeben 4 Das HTML Dokument bettet dabei direkt das Hauptskript ein Dieses erstellt einen Worker und reagiert anschliessend auf Mitteilungen die dieser Worker sendet lt DOCTYPE html gt lt html gt lt head gt lt title gt Worker Beispiel lt title gt lt head gt lt body gt lt p gt Die bis jetzt grosste gefundene Primzahl ist lt output id result gt lt output gt lt p gt lt script gt 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 lt script gt lt body gt lt html gt Der Code fur das Skript worker js sucht dabei in einer Endlosschleife nach Primzahlen und teilt dem Hauptthread immer mit wenn er eine gefunden hat var i n 1 search while true n for i 2 i lt Math sqrt n i if n i 0 continue search n ist eine Primzahl postMessage n Shared Worker BearbeitenEin gewohnlicher Worker gehort 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 SharedWorker ein so wird dieser wiederverwendet Service Worker Bearbeiten Hauptartikel Service Worker Eine weitere besondere Art eines Web Workers ist der Service Worker Dieser wird fur 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 geoffnet ist 5 Fur die Aufgabe als Proxy steht im Worker das fetch Event zur Verfugung das immer ausgelost wird wenn der Browser Daten der uberwachten Domain anfordert unabhangig davon ob dies durch AJAX Benutzernavigation oder andere Ursachen ausgelost wird Der Worker kann das Event abfangen und bei Bedarf die angeforderten Daten auf andere Weise zur Verfugung stellen Insbesondere sind Service Worker als Ersatz fur Application Cache zur Implementierung von Web Apps vorgesehen die auch offline funktionieren sollen 6 Die Spezifikation ist aber so flexibel dass zahlreiche weitere Moglichkeiten uber einen einfachen Cache hinaus moglich sind 7 Browserunterstutzung BearbeitenAlle gangigen Browser bieten zumindest grundlegende Unterstutzung fur Web Worker Mozilla Firefox ab Version 3 5 Google Chrome ab der Version 4 der Internet Explorer ab Version 10 Edge ab Version 12 8 Die Unterstutzung wurde und wird mit neueren Versionen immer weiter ausgebaut So stehen Service Worker in Firefox ab Version 44 in Chrome ab Version 40 zur Verfugung und sind auch in diesen Browsern noch nicht im kompletten Umfang implementiert 9 Normen und Standards BearbeitenWeb Workers ist standardisiert vom W3C Die aktuelle Spezifikation stammt vom 24 September 2015 Web Workers Link auf die aktuelle Spezifikation Weblinks BearbeitenWeb Worker bei SELFHTML Web Worker API auf MDN Web DocsEinzelnachweise Bearbeiten Intensive JavaScript MDN Web Docs Abgerufen am 27 Juni 2016 Lars T Hansen A Taste of JavaScript s New Parallel Primitives Veroffentlicht am 5 Mai 2016 in Mozilla Hacks abgerufen am 27 Juni 2016 Nick Desaulniers WebGL Off the Main Thread Veroffentlicht am 22 Januar 2016 in Mozilla Hacks abgerufen am 27 Juni 2016 Beispiel adaptiert von Ian Hickson Web Workers W3C Draft vom 24 September 2015 Dan Callahan Web Push Arrives in Firefox 44 Veroffentlicht am 26 Januar 2016 in Mozilla Hacks abgerufen am 27 Juni 2016 Service Workers Motivation W3C Draft vom 25 Juni 2015 Salva Beyond Offline Veroffentlicht am 21 Dezember 2015 in Mozilla Hacks abgerufen am 27 Juni 2016 Can I use Web Workers Abgerufen am 27 Juni 2016 Is ServiceWorker ready Abgerufen am 27 Juni 2016 Abgerufen von https de wikipedia org w index php title Web Worker amp oldid 236556515