Variablen zwischen Web-Arbeitern teilen? [globale Variablen?]

8

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

In Sprachen wie c # haben Sie:

%Vor%

Ich weiß, dass das ein schlechtes Beispiel ist, aber in meiner Javascript-Anwendung habe ich einen Thread, der schwere Berechnungen durchführt, die über mehrere Threads verteilt werden können [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 herausgefunden, dass die einzige Möglichkeit, eine Variable zwischen zwei Threads zu "teilen", darin besteht, einen Getter / Setter [via Prototyping] zu erstellen und dann postMessage / onmessage zu verwenden ... obwohl dies wirklich ineffizient erscheint. welches ich JSON für AFAIK verwenden muss]

LocalStorage / Database wurde aus der HTML5-Spezifikation entfernt, da dies zu Deadlocks führen kann, so dass dies keine Option ist [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 localstorage verwenden, um ints / strings zu speichern ... wieder müssen Objekte [die arrays / null] enthalten in JSON konvertiert werden ... und dann später in 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.

Danke!

    
Warty 14.02.2010, 20:42
quelle

4 Antworten

8

Web Worker werden absichtlich geteilt - nichts - alles in einem Worker ist komplett 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 kann man Sperren einführen, um diese Werte zu verwenden - bis zu einem gewissen Grad - Sie erwerben die Sperre, untersuchen und ändern vielleicht den Wert und geben dann die Sperre frei - aber Sperren sind sehr schwierig zu verwenden, und da der übliche Fehlermodus Deadlock ist, könnten Sie den Browser recht einfach "zerteilen". Das ist nicht gut für Entwickler oder Benutzer ( besonders , wenn man bedenkt, dass die Web-Umgebung so für Experimente von Nicht-Programmierern geeignet ist, die noch nie von Threads, Sperren oder Message-Passing gehört haben) Die Alternative ist kein Status zwischen Arbeitern oder Seiten im Browser. Sie können Nachrichten (die man sich vorstellen kann als "über die Leitung" 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. Sie wollen wirklich nicht die Alternative, die Sie denken, Sie wollen.

    
Jeff Walden 18.02.2010, 09:03
quelle
5

Nein, aber Sie können Nachrichten an Web-Worker senden, die Arrays, Objekte, Zahlen, Strings, Booleans und ImageData oder eine Kombination aus diesen sein können. Web-Worker können Nachrichten auch zurück senden.

    
Eli Grey 14.02.2010 21:30
quelle
2

Ich habe kürzlich darüber gelesen (aber nicht benutzt), shared worker . Laut Teilen Sie die Arbeit! Opera kommt mit SharedWorker-Unterstützung , Unterstützung nur in den neuesten Browsern (Opera 10.6, Chrome 5, Safari 5).

    
Kevin Hakanson 30.08.2010 14:34
quelle
2

Es gibt zwei Möglichkeiten, Daten zwischen dedizierten Arbeitern zu teilen:

1. Shared Workers

  

Die SharedWorker-Schnittstelle repräsentiert eine bestimmte Art von Worker   kann von mehreren Browsing-Kontexten wie z. B. mehreren aufgerufen werden   Fenster, Iframes oder sogar Arbeiter.

Einen gemeinsamen Arbeiter in einem dedizierten Arbeiter hervorbringen

2. Channel Messaging API

  

Die Channel-Messaging-API ermöglicht das Ausführen von zwei separaten Skripts   verschiedene Browsing-Kontexte, die an dasselbe Dokument angehängt sind (z. B. zwei   IFrames, oder das Hauptdokument und ein IFrame, zwei Dokumente über a   SharedWorker oder zwei Arbeiter), um direkt zu kommunizieren, übergeben   Nachrichten untereinander durch Zwei-Wege-Kanäle (oder Rohre) mit   ein Port an jedem Ende.

Wie kann ich den geteilten Mitarbeiter vom Web-Arbeiter anrufen?

    
Warlock 16.06.2015 18:43
quelle