Programmierung

Web Worker terminieren

Die JavaScript-Datei WorkerRoutine2.js benötigt nun diesen Code:

self.addEventListener("message",
function(e)
{
var data = e.data;
switch (data.cmd) {
case "start":
self.postMessage(,Web Worker wurde
gestartet: , + data.msg);
break;
case "stop":
self.postMessage(,Web Worker
wurde gestoppt: , + data.msg + ,.
(Die Schaltflaechen funktionieren nicht
mehr)");
self.close(); // Beendet den Web
Worker
break;
default:
self.postMessage(,Unbekannter
Befehl: , + data.msg);
};
}, false);

image.jpg

© Internet Magazin

Die Suche nach Primzahlen mithilfe von Web Workern beeinträchtigt nicht den Aufbau der Seite: Der Browser führt sie parallel zu aus (html5demos.com/worker).

Im obigen Beispiel ist die msg-Eigenschaft einer JSON-Mitteilung an beiden Orten zugänglich. Es scheint, als ob das Objekt direkt an den Worker übermittelt würde, obwohl dieser in einem separaten, dedizierten Speicherbereich läuft. Was in der Tat hier geschieht, ist etwas völlig anderes. Bei der Übergabe an den Worker wird das Objekt serialisiert und am anderen Ende deserialisiert. Die Webseite und der Worker teilen sich daher nicht eine einzige Instanz des Objektes, sondern zwei separate Duplikate. So entsteht bei jedem Durchlauf der Nachricht ein identisches Duplikat am anderen Ende.

Zugriff auf clientseitigen Datenspeicher

Das parallele Abarbeiten von JavaScripts ist sehr nützlich, doch es geht noch besser: Der Web Worker kann über einen Web Socket mit dem Server kommunizieren und auf clientseitigen Datenspeicher wie beispielsweise eine Datenbank zugreifen:

var server = new WebSocket("ws://
whatwg.org/database");
var database = openDatabase
("demobase", "1.0", "Demo Database",
10240);
server.onmessage = function (event) {
var data = event.data.split(, ,);
switch (data[0]) {
case "+":
database.transaction(function(tx) {
tx.executeSql("INSERT INTO pairs
(key, value) VALUES (?, ?)", data[1],
data[2]);
});
case "-":
database.transaction(function(tx) {
tx.executeSql("DELETE FROM pairs
WHERE key=? AND value=?", data[1],
data[2]);
});
}
};

Dank des Web Sockets kann ein Web Worker über den Event Handler Nachrichten vom Server entgegennehmen (server.onmessage) und Daten in die clientseitige Datenbank einfügen oder löschen. Diese Art von Web-Socket-Kommunikation befindet sich bisher allerdings noch in der Entwurfsphase.

Kommunikation mit einem gemeinsam genutzten Worker

Die Kommunikation mit einem gemeinsam genutzten Worker gestaltet sich etwas komplizierter. Anders als im Falle von dedizierten Web Workern setzt diese ein port- Objekt und einen eingehängten Event-Handler zur Ereignisverwaltung voraus. Vor dem ersten Aufruf der postMessage()- Methode müssen Sie zudem die start()- Methode des Ports aufrufen. Der Code der Ursprungsseite könnte zum Beispiel so aussehen:

var worker = new SharedWorker
("jsworker.js");
worker.port.addEventListener
("message", function(e) {
alert(e.data);
}, false);
worker.port.start();
// eine Nachricht an den Worker
senden
worker.port.postMessage
("Magnus-Leser");

Beim Empfang der ersten Nachricht von einem Skript muss ein gemeinsam genutzter Web Worker an den betreffenden Port einen Event-Handler anhängen, der meistens selbst die postMessage()-Methode aufruft, um dem Sender der eingehenden Nachricht zu antworten. Auch in diesem Fall muss die start()-Methode im Rahmen des Workers ausgeführt werden:

var connections = 0; // aktive
Verbindungen zählen
self.addEventListener("connect",
function (e) {
var port = e.ports[0];
connections++;
port.addEventListener("message",
function (e) {
port.postMessage("Hallo " + e.data +
" (port #" + connections + ")");
}, false);
port.start();
}, false);

Durch den Aufruf der port.close()-Methode kann ein gemeinsam genutzter Worker von sich aus weitere Kommunikation an einem Port verhindern. Die Implementierung gemeinsam genutzter Worker durch die führenden Webbrowser ist aufgrund der etwas höheren Komplexität noch nicht so weit gediehen wie die Unterstützung für dedizierte Worker.

Web Worker terminieren

Es gibt zwei Methoden zum Beenden von Web Workern. Zum einen kann das Skript der Ursprungswebseite seine Web Worker mithilfe der Methode worker.terminate() beenden. Die Methode self.close() erledigt diese Aufgabe aus dem Code im Inneren des betreffenden Workers heraus, zum Beispiel so:

self.onmessage = function(e) {
if (e.data == "Stop!") self.close();
};

Web Worker und Multi-Core

Der Trend zur Parallelisierung macht sich neuerdings auch bei mobilen Geräten zunehmend bemerkbar. Multi-Core-Designs tauchen längst nicht nur in Servern und Desktop-Rechnern, sondern auch in Netbooks, Tablets und in sogar Smartphones auf.

Mehr zum Thema

Youtube Sperre umgehen GEMA
Videos freischalten

So umgehen Sie die GEMA-Sperre bei Youtube. Was Sie dazu brauchen, und wie es am einfachsten geht.
Neue Fritzboxen unterstützen den AC-Standard.
WLAN-Geschwindigkeit verdoppeln

Mehr WLAN-Geschwindigkeit: Mit dem WLAN-Standard 802.11ac und den richtigen Geräten und Einstellungen verdoppeln Sie den Datendurchsatz.
Netflix auf dem TV
Programm in der Übersicht

Welche Filme und Serien gibt es bei Netflix eigentlich zu sehen? Was ist neu im Streaming-Angebot? Diese Antworten helfen weiter.
Netflix
Streaming

Preise, kompatible Geräte, Datenrate, Serien- und Filmangebot von Netflix: Wir beantworten die wichtigsten Fragen rund um den Streaming-Dienst.
Film Amazon Prime Instant Video Warner Bros Emily Browning
Vorschau auf Film- und Serien-Highlights

Prime Instant Video lockt im Oktober mit Highlights wie "Sucker Punch", "Fifty Shades of Grey", "Spotlight" und der zweiten Staffel von "Ash vs. Evil…