13 Stimmen

Gemeinsame Nutzung von Variablen durch Webworker? [globale Variablen?]

Gibt es eine Möglichkeit für mich, eine Variable zwischen zwei Web-Workern zu teilen? (Web Worker sind im Grunde Threads in Javascript)

In Sprachen wie c# haben Sie:

public static string message = "";
static void Main()
{
 message = "asdf";
 new Thread(mythread).Run();
}
public static void mythread()
{
 Console.WriteLine(message); //outputs "asdf"
}

Ich weiß, dass ist ein schlechtes Beispiel, aber in meiner Javascript-Anwendung, ich habe einen Thread tun schwere Berechnungen, die über mehrere Threads verteilt werden können [da ich einen großen Brocken von Daten in Form eines Arrays haben. Alle Elemente des Arrays sind unabhängig voneinander. Mit anderen Worten, meine Arbeits-Threads müssen sich nicht um Sperren oder ähnliches kümmern]

Ich habe gefunden, die einzige Möglichkeit, "teilen" eine Variable zwischen zwei Threads wäre ein Getter/Setter [über Prototyping] zu erstellen und verwenden Sie dann postMessage/onmessage... obwohl dies scheint wirklich ineffizient [vor allem mit Objekten, die ich JSON für AFAIK verwenden müssen]

LocalStorage/Database wurde aus der HTML5-Spezifikation herausgenommen, weil es zu Deadlocks führen könnte, also ist das keine Option [leider]...

Die andere Möglichkeit, die ich gefunden habe, war, PHP zu verwenden, um tatsächlich eine getVariable.php und setVariable.php Seiten, die localstorage verwenden, um Ints/Strings zu speichern... wieder einmal, Objekte [die Arrays/Null enthält] müssen in JSON konvertiert werden... und dann später, JSON.parse()'d.

Soweit ich weiß, sind Javascript-Worker-Threads vollständig vom Hauptseiten-Thread isoliert [weshalb Javascript-Worker-Threads nicht auf DOM-Elemente zugreifen können

Obwohl postMessage funktioniert, ist es langsam.

0 Stimmen

Sie können sharedArrayBuffer verwenden, die beim Senden an postMessage geklont werden. Hier ist ein Artikel darüber Link

19voto

Jeff Walden Punkte 6718

Web-Worker werden absichtlich nicht gemeinsam genutzt - alles in einem Worker ist vor anderen Workern und vor den Seiten im Browser vollständig verborgen. Gäbe es eine Möglichkeit, nicht "atomare" Werte zwischen Workern auszutauschen, wäre es nahezu unmöglich, die Semantik dieser Werte mit vorhersehbaren Ergebnissen zu nutzen. Nun, eine könnte Sperren einführen, um solche Werte bis zu einem gewissen Grad zu nutzen - man erwirbt die Sperre, untersucht und ändert vielleicht den Wert und gibt dann die Sperre wieder frei -, aber Sperren sind sehr schwierig zu benutzen, und da der übliche Fehlermodus Deadlock ist, könnte man den Browser ziemlich leicht "blockieren". Das ist weder für Entwickler noch für Benutzer gut ( insbesondere wenn man bedenkt, dass die Web-Umgebung so experimentierfreudig für Nicht-Programmierer ist, die noch nie etwas von Threads, Sperren oder Message-Passing gehört haben), so dass die Alternative kein gemeinsamer Zustand zwischen Workern oder Seiten im Browser ist. Man kann Nachrichten (die man sich als serialisiert "über den Draht" an den Worker vorstellen kann, der dann seine eigene Kopie des ursprünglichen Wertes auf der Grundlage der serialisierten Informationen erstellt) weitergeben, ohne eines dieser Probleme angehen zu müssen.

Tatsächlich ist Message-Passing der richtige Weg, um Parallelität zu unterstützen, ohne dass die Gleichzeitigkeitsprobleme völlig außer Kontrolle geraten. Wenn Sie die Übergabe von Nachrichten richtig organisieren, sollten Sie genauso leistungsfähig sein, wie wenn Sie den Zustand gemeinsam nutzen könnten. Die Alternative, von der Sie glauben, dass Sie sie wollen, wollen Sie nicht wirklich.

1 Stimmen

Wenn es irgendeine Möglichkeit gäbe, nicht "atomare" Werte zwischen Arbeitern auszutauschen, wäre es unmöglich, die Semantik dieser Werte mit vorhersehbaren Ergebnissen zu verwenden.<-- Absolut falsch in jeder Hinsicht.

1 Stimmen

Lamport's Bäckerei Algorithmus. Dijkstra bewachte Befehlslogik. Das alles ist speziell für nicht-deterministische Vorhersagbarkeit.

1 Stimmen

Na gut, dann eben "fast unmöglich". Es bleibt wahr, dass die gemeinsame Nutzung von nicht einfachen Daten sehr leicht falsch sein kann, und aus diesem Grund ist es nichts, was man mit Web Workern machen kann.

6voto

Warlock Punkte 7083

Es gibt zwei Optionen für die gemeinsame Nutzung von Daten durch bestimmte Mitarbeiter:

1. Geteilte Arbeitskräfte

Die Schnittstelle SharedWorker stellt eine bestimmte Art von Arbeitern dar, die von mehreren Browsing-Kontexten aus zugegriffen werden kann, z. B. von mehreren Windows, iframes oder sogar Worker.

Einen geteilten Arbeiter in einen dedizierten Arbeiter einbringen

2. Channel Messaging API

Die Channel Messaging API ermöglicht zwei separate Skripte, die in verschiedenen Browsing-Kontexten laufen, die mit demselben Dokument verbunden sind (z. B. zwei IFrames, oder das Hauptdokument und ein IFrame, zwei Dokumente über einen SharedWorker oder zwei Worker), direkt miteinander zu kommunizieren, indem sie Nachrichten untereinander über bidirektionale Kanäle (oder Pipes) mit einem Port an jedem Ende.

Wie ruft man Shared Worker vom Webworker aus auf?

0 Stimmen

Shared Worker sind Worker, die in einem Netzwerk von Nachrichten verbunden werden können, anstelle des einfachen Nachrichtenbaums von dedizierten Workern. Das Grundprinzip der Worker bleibt jedoch bestehen: Sie können nichts zwischen Workern teilen, sondern nur Nachrichten weitergeben.

1 Stimmen

Aber die Kompatibilität :/ developer.mozilla.org/de-US/docs/Web/API/

5voto

Eli Grey Punkte 34008

Nein, aber Sie können Nachrichten an Web Worker senden, die aus Arrays, Objekten, Zahlen, Strings, Booleans und ImageData oder einer beliebigen Kombination davon bestehen können. Webworker können auch Nachrichten zurücksenden.

2voto

Kevin Hakanson Punkte 40091

Ich habe vor kurzem darüber gelesen (aber noch nicht benutzt), geteilte Arbeit . Nach Teilen Sie die Arbeit! Opera kommt mit SharedWorker-Unterstützung Unterstützung gibt es nur in den neuesten Browsern (Opera 10.6, Chrome 5, Safari 5).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X