2010-02-14 16 views
8

Gibt es eine Möglichkeit für mich, eine Variable zwischen zwei Web-Arbeiter zu teilen? (Web Arbeiter fädelt grundsätzlich in Javascript)Variablen zwischen Web-Arbeitern teilen? [globale Variablen?]

In Sprachen wie C# Sie haben:

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

Ich weiß, das ist ein schlechtes Beispiel, aber in meinem Javascript-Anwendung, habe ich einen Thread schwere Berechnungen zu tun, dass sein können über mehrere Threads verteilt [da ich einen großen Datenblock in Form eines Arrays habe. Alle Elemente des Arrays sind unabhängig voneinander. Mit anderen Worten, meine Worker-Threads müssen sich nicht um das Sperren oder Ähnliches kümmern]

Ich habe gefunden, dass die einzige Möglichkeit, eine Variable zwischen zwei Threads zu "teilen", ein Getter/Setter [via Prototyping] und dann postMessage/onmessage verwenden ... obwohl dies wirklich ineffizient scheint [speziell bei Objekten, die ich JSON für AFAIK verwenden muss]

LocalStorage/Database wurde aus der HTML5-Spezifikation entfernt, weil dies dazu führen könnte Deadlocks, das ist also keine Option [traurig] ...

Die andere Möglichkeit, die ich gefunden habe, war, PHP zu verwenden, um tatsächlich eine getVariable.php und setVariable.php Seiten zu haben, die localstorage verwenden, um i zu speichern nts/strings ... wiederum müssen Objekte [die arrays/null] in JSON ... und dann später in JSON.parse() 'd konvertiert werden.

Soweit ich weiß, sind Javascript-Worker-Threads völlig von der Hauptseite Thread [isoliert, die warum Worker-Threads Javascript ist nicht DOM-Elemente

Obwohl postmessage arbeitet zugreifen können, es ist langsam.

Danke!

Antwort

8

Web Worker werden absichtlich geteilt - nichts - alles in einem Worker ist vollständig vor anderen Arbeitern und Seiten im Browser verborgen. Wenn es einen Weg gäbe, nicht-atomare Werte zwischen Arbeitern zu teilen, wäre die Semantik dieser Werte nahezu unmöglich mit vorhersagbaren Ergebnissen zu verwenden. Nun, ein könnte vorstellen Schlösser als eine Möglichkeit, solche Werte zu verwenden, bis zu einem gewissen Grad - Sie erwerben das Schloss, untersuchen und vielleicht den Wert ändern, dann das Schloss freigeben - aber Sperren sind sehr schwierig zu bedienen, und seit Der übliche Fehlermodus ist Deadlock, in dem Sie den Browser ziemlich einfach "brick" machen können. Das ist nicht gut für Entwickler oder Benutzer (speziell, wenn Sie bedenken, dass die Webumgebung so experimentierfreudig für Nicht-Programmierer ist, die noch nie von Threads, Sperren oder Message-Passing gehört haben), so dass die Alternative kein Zustand ist zwischen Arbeitern oder Seiten im Browser geteilt. Sie können Nachrichten (die man sich vorstellen kann als "over the wire" serialisiert an den Worker übergeben, der dann eine eigene Kopie des ursprünglichen Werts basierend auf den serialisierten Informationen erstellt), ohne eines dieser Probleme anzugehen.

Wirklich, Message-Passing ist der richtige Weg, um Parallelität zu unterstützen, ohne dass die Nebenläufigkeitsprobleme völlig außer Kontrolle geraten. Orchestrieren Sie Ihre Nachrichtenübergaben ordnungsgemäß und Sie sollten genauso viel Energie haben, als wenn Sie den Status teilen könnten. Du willst wirklich nicht die Alternative, von der du denkst, dass du willst.

+0

Wenn eine Möglichkeit gibt es nicht „atomare“ Werte zwischen Arbeitern zu teilen, wäre es unmöglich, mit vorhersehbarem Ergebnis die Semantik dieser Werte zu verwenden. <- Absolut falsch in jeder Hinsicht. – Tony

+0

Pflege um zu erarbeiten? –

+0

Lamports Backalgorithmus. Dijkstra bewachte Befehlslogik. Alles ist speziell für die nicht-deterministische Vorhersagbarkeit. – Tony

5

Nein, aber Sie können Nachrichten an Web-Worker senden, die Arrays, Objekte, Zahlen, Strings, booleans und ImageData oder eine beliebige Kombination von diesen sein können. Web-Mitarbeiter können auch Nachrichten zurücksenden.

2

Es gibt zwei Möglichkeiten, Daten zwischen engagierten Mitarbeitern zu teilen:

1. Shared Workers

Der SharedWorker Schnittstelle eine bestimmte Art von Arbeitnehmern darstellen, dass kann aus mehreren Browsern-Kontext zugegriffen werden, wie als mehrere Fenster, Iframes oder sogar Arbeiter.

Spawning a Shared Worker in a Dedicated Worker

2. Channel Messaging API

Der Kanal Messaging API ermöglicht es, zwei getrennte Scripts in verschiedenen Browser-Kontexten an demselben Dokument ausgeführt wird (zB zwei IFrames oder Hauptdokument und ein IFrame, zwei Dokumente über eine SharedWorker oder zwei Arbeiter), um direkt zu kommunizieren, messag übergeben zwischen den beiden durch Zwei-Wege-Kanäle (oder Rohre) mit ein Port an jedem Ende.

How to call shared worker from the web worker?

+0

Geteilte Mitarbeiter sind Mitarbeiter, die in einem Netzwerk von Nachrichten anstelle des einfachen Nachrichtenbaums von engagierten Mitarbeitern verbunden werden können. Allerdings gilt das Grundprinzip von Arbeitern: Sie können nichts zwischen Arbeitern teilen, nur Nachrichten weitergeben. – solendil

+1

Aber die Kompatibilität:/https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker#Browser_compatibility – Luckylooke