Frage

Gibt es für mich eine Möglichkeit, eine Variable zwischen zwei Web-Arbeiter zu teilen? (Web-Arbeiter sind grundsätzlich Threads in Javascript)

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 meiner Javascript-Anwendung, habe ich einen Thread schwere Berechnungen zu tun, die Ausbreitung über mehrere Threads sein kann [da ich einen großen Teil der Daten in der Form eines Arrays. Alle Elemente des Arrays sind voneinander unabhängig. Mit anderen Worten, muss meine Arbeitsthreads zu Sperren oder ähnliches]

do not care

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

Localstorage / Datenbank wurde der HTML5-Spezifikation herausgenommen, weil sie in Deadlocks führen könnten, so dass 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 zu haben, die Verwendung local zum Speichern Ints / strings ... wieder, Objekte [die Arrays / null enthält] müssen umgewandelt zu JSON ... und dann später, JSON.parse () 'd.

Soweit ich weiß, sind Javascript-Worker-Threads völlig von der Hauptseite Thread isoliert [weshalb Javascript-Worker-Threads nicht zugreifen kann DOM-Elemente

Obwohl postmessage funktioniert, es ist langsam.

War es hilfreich?

Lösung

Web Arbeiter bewusst shared-nothing - alles in einem Arbeiter vollständig von anderen Arbeitern und von Seiten im Browser verborgen ist. Wenn es irgendeine Art und Weise ist nicht „atomare“ Werte zwischen Arbeitern zu teilen, würde die Semantik dieser Werte fast unmöglich sein, mit vorhersehbarem Ergebnis zu verwenden. Jetzt, ein könnte einführen Schlösser als eine Möglichkeit, solche Werte zu verwenden, zu einem gewissen Grad - Sie die Sperre zu erwerben, prüfen und vielleicht den Wert ändern, dann die Sperre - aber Schlösser sind sehr heikel Gebrauch, und da der Modus üblichen Ausfall ist Deadlock Sie den Browser „Ziegel“ ziemlich leicht würde. Das ist nicht gut für Entwickler oder Anwender ( insbesondere , wenn man bedenkt, dass die Web-Umgebung für Experimente von Nicht-Programmierern so zugänglich ist, die noch nie selbst von Threads gehörte, Schlössern oder Message-Passing), so die Alternative ist kein Staat zwischen Arbeitnehmern oder Seiten im Browser geteilt. Sie können Nachrichten passieren (die man sich denken kann als „über den Draht“ zu den Arbeitern serialisiert, die dann seine eigene Kopie des ursprünglichen Wertes auf den serialisierten Informationen basierend erstellt) ohne diese Probleme zu lösen zu haben.

Wirklich, Message-Passing ist der richtige Weg, um Unterstützung Parallelität, ohne dass die Parallelität Probleme außer Kontrolle vollständig erhalten. Orchestrieren Ihre Nachricht Weiterreichungen richtig, und Sie sollten genau so viel Macht haben, als ob Sie Staat teilen. Sie wirklich wollen nicht die Alternative, die Sie denken, Sie wollen.

Andere Tipps

Nein, aber Sie können Nachrichten auf dem Web-Arbeiter senden, die Arrays sein können, Objekte, Zahlen, Strings, Boolesche Werte und Imagedata oder eine beliebige Kombination davon. Web Arbeiter können Nachrichten schicken.

Es gibt zwei Möglichkeiten, um Daten auszutauschen zwischen engagierten Mitarbeitern:

1. Geteilt Arbeiter

  

Die SharedWorker-Schnittstelle stellt eine bestimmte Art von Arbeitnehmern, dass   kann aus mehreren Browser-Kontexten, wie mehrere zugegriffen werden   Fenster, iframes oder sogar Arbeiter.

Laichen ein Geteilt Worker in einem dedizierten Worker

2. Channel-Messaging API

  

Der Kanal Messaging API ermöglicht es, zwei getrennte Ausführen von Skripts in   verschiedene Browser-Kontexte auf dasselbe Dokument angebracht (z.B. zwei   IFrames oder das Hauptdokument und ein IFrame, zwei Dokumente über eine   SharedWorker oder zwei Arbeiter) direkt zu kommunizieren, vorbei   Nachrichten zwischen miteinander über bidirektionale Kanäle (oder Rohre) mit   ein Port an jedem Ende.

Wie shared Arbeiter aus dem Web-Arbeiter nennen?

ich kürzlich gelesen (aber haben nicht verwendet), shared Arbeiter . Nach Teilen Sie die Arbeit! Opera kommt mit SharedWorker Unterstützung , Unterstützung ist nur in den neuesten Browsern (Opera 10.6, Chrome 5, Safari 5).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top