Programmierung
Web Worker terminieren
- JavaScript parallel ausführen mit der Web Workers API
- Web Worker terminieren
- Threads für JavaScript
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);

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.
Gutscheine
-
Peek & Cloppenburg* Düsseldorf
GLAMOUR SHOPPING WEEK bei Peek & Cloppenburg*: 20% Gutschein Zum Gutschein
bis 08.10.2023+ bis zu 1,0% Cashback -
XXXLutz
Glamour Shopping Week bei XXXLutz: 30% Rabatt + 22% Gutschein Zum Gutschein
bis 08.10.2023+ bis zu 3,0% Cashback -
Levi Strauss & Co.
Bis 25% sparen mit dem Levis Rabattcode zur GLAMOUR Shopping Week Zum Gutschein
bis 08.10.2023 -
DAZN
15€ Rabatt monatlich mit dem Jahresabo für DAZN Unlimited Zum Gutschein
bis 08.11.2023 -
Nespresso
Für Coffee Lover: 15% NESPRESSO Gutschein Zum Gutschein
bis 08.10.2023+ bis zu 1,5% Cashback -
eBay
10% Gutscheincode auf DYSON Zum Gutschein
bis 04.10.2023