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);

© 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 lesen

Chronologische Liste und Netflix-Links -

Neuerscheinungen in der Übersicht -

Vorschau auf Film- und Serien-Highlights -

Mehr zum Thema

Webdesign

Adobe Illustrator wird im Webdesign immer beliebter. Wie Sie das Tool richtig einsetzen, erfahren Sie hier.
Facebook

Was sind die Implikationen für Unternehmen und Endanwender bei Facebooks neuer Suche Graph Search?
Online-Recht

Allgemeine Geschäftsbedingungen liest sich niemand gerne durch. Sie sind jedoch notwendig und äußerst sinnvoll. Worauf sie achten sollten.
Online-Recht in der Cloud

Dateien werden immer häufiger in der Cloud bereitgestellt. Rechtlich ist das jedoch durchaus problematisch. Wir klären über das Urheberrecht in der…
E-Commerce-Logistik

Für den Erfolg eines Online-Shops sind zahlreiche Faktoren verantwortlich. Neben Produktvielfalt und Darstellung der Waren gehört auch die Logistik.