2010-02-14 17 views
8

¿Hay alguna forma de compartir una variable entre dos trabajadores de la web? (Trabajadores Web son básicamente Temas en Javascript)¿Compartir variables entre los trabajadores de la web? [variables globales?]

En lenguajes como C# tiene:

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

Sé que eso es un mal ejemplo, pero en mi solicitud Javascript, tengo un hilo haciendo cálculos pesados ​​que pueden ser se extendió a través de múltiples hilos [ya que tengo una gran cantidad de datos en forma de una matriz. Todos los elementos de la matriz son independientes entre sí. En otras palabras, mis hilos de trabajo no tienen que preocuparse por el bloqueo o algo así]

He encontrado que la única forma de "compartir" una variable entre dos hilos sería crear un Getter/setter [a través de prototyping] y luego use postMessage/onmessage ... aunque esto parece realmente ineficiente [especialmente con objetos, que tengo que usar JSON para AFAIK]

LocalStorage/Database ha sido eliminado de la especificación HTML5 porque podría dar como resultado callejones sin salida, por lo que no es una opción [tristemente] ...

La otra posibilidad que he encontrado era utilizar PHP que en realidad tienen un getVariable.php y setVariable.php páginas, que utilizan almacenamiento local para almacenar i nts/strings ... una vez más, los objetos [que incluyen arrays/null] deben convertirse a JSON ... y luego a JSON.parse() 'd.

Por lo que yo sé, los subprocesos de trabajo de Javascript están totalmente aislados de la principal página de hilo [por lo que los subprocesos de trabajo JavaScript no pueden acceder a los elementos DOM

Aunque postMessage funciona, es lento.

Gracias!

Respuesta

8

Los trabajadores de la web se comparten deliberadamente, nada, todo en un trabajador está completamente oculto de otros trabajadores y de las páginas del navegador. Si hubiera alguna forma de compartir valores no "atómicos" entre los trabajadores, la semántica de esos valores sería casi imposible de usar con resultados predecibles. Ahora, uno podría introducir bloqueos como una forma de usar tales valores, hasta cierto punto - adquiere el bloqueo, examina y tal vez modifique el valor, luego libera el bloqueo - pero los bloqueos son muy difíciles de usar, y desde el modo de falla habitual es un punto muerto en el que podría "bloquear" el navegador con bastante facilidad. Eso no es bueno para desarrolladores o usuarios (especialmente si consideramos que el entorno web es tan susceptible a la experimentación de personas que no son programadores y que nunca han oído hablar de hilos, bloqueos o mensajes), por lo que la alternativa es no compartido entre trabajadores o páginas en el navegador. Puede pasar mensajes (lo que se puede considerar que se serializa "por cable" al trabajador, que luego crea su propia copia del valor original en base a la información serializada) sin tener que abordar ninguno de estos problemas.

Realmente, el paso de mensajes es la manera correcta de soportar el paralelismo sin permitir que los problemas de concurrencia se salgan completamente de control. Organice sus entregas de mensajes correctamente y debería tener tanta potencia como si pudiera compartir estado. Realmente no quieres la alternativa que crees que quieres.

+0

Si hubiera alguna manera de compartir los valores que no sean "atómicas" entre los trabajadores, la semántica de esos valores serían imposibles de usar con resultados predecibles <-. Absolutamente mal en todos los sentidos. – Tony

+0

¿Cuidar para elaborar? –

+0

Algoritmo de panadería de Lamport. Dijkstra guardó la lógica de comando. Todo es específicamente para predecibilidad no determinista. – Tony

5

No, pero puede enviar mensajes a los trabajadores de la web que pueden ser matrices, objetos, números, cadenas, booleanos e ImageData o cualquier combinación de estos. Los trabajadores de la web también pueden enviar mensajes.

2

Hay dos opciones para compartir datos entre los trabajadores dedicados:

1. Shared Workers

La interfaz SharedWorker representa un tipo específico de trabajo que se puede acceder desde varios contextos de navegación, tales como varias ventanas , iframes o incluso trabajadores.

Spawning a Shared Worker in a Dedicated Worker

2. Channel Messaging API

La API de mensajería de canal permite que dos secuencias de comandos que se ejecutan en distintos contextos de navegación diferentes conectados al mismo documento (por ejemplo, dos IFrames, o la documento principal y un IFrame, dos documentos a través de SharedWorker, o dos trabajadores) para comunicarse directamente, pasando messag es entre sí a través de canales bidireccionales (o tuberías) con un puerto en cada extremo.

How to call shared worker from the web worker?

+0

Los trabajadores compartidos son trabajadores que pueden vincularse en una red de mensajes, en lugar del simple árbol de mensajes de trabajadores dedicados. Sin embargo, el principio básico de los trabajadores es cierto: no se puede compartir nada entre los trabajadores, solo pasar mensajes. – solendil

+1

Pero la compatibilidad:/https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker#Browser_compatibility – Luckylooke