Austausch von Variablen zwischen web-worker? [Globale Variablen?]
Ist es eine Möglichkeit für mich zu share eine variable zwischen zwei web-worker? (Web-worker sind im Grunde 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, ich habe einen thread tun, schwere Berechnungen, die sich auf mehrere threads [da habe ich einen großen Teil der Daten in form eines Arrays. Alle Elemente des Arrays sind unabhängig von einander. In anderen Worten, meine worker-threads müssen nicht zu kümmern, sperren oder etwas ähnliches]
Habe ich gefunden, nur so "teilen" sich eine variable zwischen zwei threads wäre eine "Getter/setter" [via prototyping] und dann mit postMessage/onmessage... obwohl dies scheint wirklich ineffizient [vor allem mit Objekten, die ich habe zu verwenden JSON für AFAIK]
LocalStorage - /Datenbank wurde aus der HTML5-Spezifikation, da kann es vorkommen, deadlocks, so dass eine option nicht [leider]...
Die andere Möglichkeit, die ich gefunden habe, war der Einsatz von PHP, um einen getVariable.php und setVariable.php Seiten, die Verwendung von localstorage zum speichern von int-Werten/strings... wieder einmal, Objekte [was beinhaltet arrays/null] umgewandelt werden müssen JSON... und dann später, JSON.parse()'d....
Soweit ich weiß, ist Javascript-worker-threads sind vollkommen isoliert von der Hauptseite-thread [was ist der Grund, warum Javascript-worker-threads keinen Zugriff auf DOM-Elemente
Obwohl postMessage funktioniert, ist es langsam.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Web-worker sind bewusst shared-nothing -- alles, was ein Arbeiter wird völlig ausgeblendet, von anderen Arbeitnehmern und die von Seiten im browser. Wenn es irgendeine Möglichkeit gab, Aktien nicht"atomic" - Werte zwischen den Beschäftigten, die die Semantik der Werte, die fast unmöglich zu verwenden, mit vorhersagbaren Ergebnissen. Nun, eine könnte einzuführen, sperren als ein Weg, um solche Werte zu einem gewissen Grad-Sie erwerben das Schloss, untersuchen und vielleicht ändern Sie den Wert, dann Freigabe der sperren-aber Schlösser sind sehr schwierig zu verwenden, und da die üblichen Ausfall-Modus ist deadlock-Sie wäre in der Lage "Stein" der browser ziemlich leicht. Das ist nicht gut für Entwickler und Nutzer (besonders, wenn man bedenkt, dass die web-Umgebung ist so offen für Experimente durch nicht-Programmierer, die noch nie gehört hast von threads, sperren oder message-passing), so dass die alternative ist kein Staat geteilt zwischen Arbeitnehmer oder Webseiten im browser. Sie können pass-Nachrichten (die man sich vorstellen kann, wie serialisiert wird, "über dem Draht" an die Arbeiter, die dann erstellt seine eigene Kopie der original-Wert auf der Basis der serialisierten Informationen), ohne dass das angehen dieser Probleme.
Wirklich, message-passing ist der richtige Weg zur Unterstützung von Parallelität, ohne dass die Parallelität Probleme bekommen, völlig außer Kontrolle. Inszenieren Sie Ihre Botschaft übergaben richtig und Sie sollten genauso viel Strom als wenn Sie könnten, Staat. Sie wollen wirklich nicht die alternative, die Sie denken, Sie wollen.
Nein, aber Sie können Nachrichten senden, zu web-worker werden können, arrays, Objekte, zahlen, Zeichenfolgen, booleans, und die Bilddaten oder eine beliebige Kombination von diesen. Web worker können Nachrichten senden auch zurück.
Gibt es zwei Optionen zum freigeben von Daten zwischen engagierten Arbeitern:
1. Gemeinsamen Arbeiter
Erzeugen eines Shared-Arbeiter in einem Engagierten Arbeiter
2. Channel Messaging-API
Wie nennen shared worker aus dem web worker?
Vor kurzem Las ich über (aber nicht genutzt haben), gemeinsamen Arbeiter. Nach Die Arbeit teilen! Opera kommt mit SharedWorker Unterstützung, support ist nur in den neuesten Browsern (Opera 10.6, Chrome 5, Safari 5).