Question

Est-il possible pour moi de partager une variable entre deux travailleurs web? (Travailleurs Web sont des fils essentiellement en Javascript)

Dans les langues comme c # vous:

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

Je sais que ce mauvais exemple, mais dans mon application Javascript, j'ai un fil faire des calculs lourds qui peuvent être réparties sur plusieurs threads [depuis que je suis une grande partie des données sous la forme d'un tableau. Tous les éléments du tableau sont indépendants les uns des autres. En d'autres mots, mes fils de travailleurs ne doivent pas se soucier de verrouillage ou quelque chose comme ça]

J'ai trouvé la seule façon de « partager » une variable entre deux fils serait de créer un getter / setter [via le prototypage] et utilisez postMessage / onmessage ... bien que cela semble vraiment inefficace [en particulier avec des objets, que je dois utiliser JSON pour autant que je sache]

LocalStorage / base de données a été retiré de la spécification HTML5 car il pourrait entraîner des blocages, de sorte que ce n'est pas une option [malheureusement] ...

L'autre possibilité que j'ai trouvé était d'utiliser PHP pour avoir fait une pages getVariable.php et setVariable.php, qui utilisent localStorage pour stocker ints / cordes ... une fois de plus, les objets [qui comprend des tableaux / null] doivent être converti en JSON ... puis plus tard, JSON.parse () 'd.

Pour autant que je sache, les threads de travail Javascript sont totalement isolés du fil principal de la page [qui est la raison pour laquelle les threads de travail Javascript ne peuvent pas accéder aux éléments DOM

Bien que fonctionne postMessage, il est lent.

Était-ce utile?

La solution

Web workers sont délibérément rien partagé - tout travailleur est complètement caché d'autres travailleurs et des pages dans le navigateur. S'il y avait un moyen de partager des valeurs non « atomiques » entre les travailleurs, la sémantique de ces valeurs serait presque impossible d'utiliser avec des résultats prévisibles. Maintenant, un peut introduire des serrures comme un moyen d'utiliser ces valeurs, dans une certaine mesure - vous acquérir le verrou, examiner et modifier peut-être la valeur, puis relâchez le verrou - mais les serrures sont très délicates à utiliser, puisque le mode d'échec habituel est une impasse que vous seriez en mesure de « brique » le navigateur assez facilement. Ce n'est pas bon pour les développeurs ou les utilisateurs ( en particulier si l'on considère que l'environnement web est si prête à l'expérimentation par des non-programmeurs qui ont même jamais entendu parler de fils, serrures ou passage de messages), de sorte l'alternative est pas état partagé entre les travailleurs ou les pages dans le navigateur. Vous pouvez passer des messages (que l'on peut considérer comme étant sérialisé « sur le fil » au travailleur, ce qui crée alors sa propre copie de la valeur originale basée sur les informations sérialisé) sans avoir à répondre à aucun de ces problèmes.

Vraiment, passage de messages est la bonne façon de soutenir le parallélisme sans laisser les problèmes de concurrence se complètement hors de contrôle. Orchestrer correctement votre message et vous devriez handoffs avoir tout autant de pouvoir que si vous pouviez partager l'état. Vous ne voulez vraiment pas l'alternative que vous pensez que vous voulez.

Autres conseils

Non, mais vous pouvez envoyer des messages aux travailleurs Web qui peuvent être des tableaux, des objets, des nombres, des chaînes, booléens et ImageData ou toute combinaison de ceux-ci. Web workers peuvent envoyer des messages de retour aussi.

Il y a deux options pour partager des données entre les travailleurs dédiés:

1. travailleurs partagés

  

L'interface SharedWorker représente un type spécifique de travailleur qui   peut être accessible à partir de plusieurs contextes de navigation, comme plusieurs   fenêtres, iframes ou même les travailleurs.

fraye un travailleur partagé dans un processus dédié

2. Channel API Messaging

  

L'API du canal de messagerie permet à deux scripts distincts en cours d'exécution en   différents contextes de navigation attachés au même document (par exemple, deux   IFrame, ou le document principal et un IFrame, deux documents via un   SharedWorker ou deux travailleurs) de communiquer directement, en passant   des messages entre eux par des canaux bilatéraux (ou tubes) avec   un orifice à chaque extrémité.

Comment appeler travailleur partagé du travailleur Web?

J'ai récemment lu (mais ne l'ai pas utilisé), travailleurs partagés . Selon Partager le travail! Opera est livré avec le soutien de SharedWorker , le soutien est seulement dans les nouveaux navigateurs (Opera 10.6, Chrome 5, Safari 5).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top