Pregunta

¿Hay alguna manera para mí para compartir una variable entre dos web a los trabajadores?(Web de los trabajadores son, básicamente, los hilos en Javascript)

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 aplicación de Javascript, tengo un hilo haciendo pesados cálculos que se pueden difundir a través de múltiples hilos [ya que tengo una gran cantidad de datos en forma de matriz.Todos los elementos de la matriz son independientes el uno del otro.En otras palabras, mi subprocesos de trabajo no tienen que ocuparse de bloqueo ni nada de eso]

He descubierto que la única manera de "compartir" una variable entre dos hilos de sería la creación de un Getter/setter [a través de la creación de prototipos] y, a continuación, utilizar postMessage/onmessage...aunque esto parece muy ineficiente [especialmente con los objetos, que tengo que usar JSON para AFAIK]

LocalStorage/Base de datos ha sido tomado de la especificación de HTML5, ya que podría resultar en interbloqueos, por lo que no es una opción [lamentablemente]...

La otra posibilidad que he encontrado fue el uso de PHP para tener realmente una getVariable.php y setVariable.php páginas, que el uso de localstorage para almacenar enteros/cadenas...una vez más, los Objetos [que incluye matrices/null] tienen que ser convertidos a JSON...y luego, más tarde, JSON.parse()'d.

Hasta donde yo sé, Javascript subprocesos de trabajo son totalmente aislado de la página principal del hilo [que es la razón por Javascript subprocesos de trabajo no podemos acceder a los elementos del DOM

Aunque postMessage obras, es lento.

¿Fue útil?

Solución

Los Web workers son deliberadamente compartido-nada-todo en un trabajador es totalmente oculta para el resto de los trabajadores y de las páginas en el navegador.Si había alguna manera de compartir no"atómica" valores entre los trabajadores, la semántica de los valores sería casi imposible de usar con resultados predecibles.Ahora, uno podría introducir los bloqueos como una manera de utilizar estos valores, que en cierta medida, usted adquirir el bloqueo, examinar y tal vez modificar el valor, a continuación, suelte el bloqueo -- pero bloqueos son muy difíciles de utilizar, y desde el habitual modo de fallo es de interbloqueo usted sería capaz de "ladrillo" del navegador muy fácilmente.Eso no es bueno para los desarrolladores o usuarios (especialmente cuando se considera que el entorno web es tan susceptible a la experimentación por parte de los no-programadores que nunca hemos oído hablar de los hilos, cierres, o de paso de mensajes), por lo que la alternativa no es estado compartido entre los trabajadores o de las páginas en el navegador.Se puede pasar de mensajes (que uno puede pensar como la serialización "sobre el alambre" para el trabajador, que crea su propia copia de la original de valor basado en la información serializada) sin tener que solucionar alguno de estos problemas.

Realmente, de paso de mensajes es la manera correcta de apoyo paralelismo sin dejar que los problemas de simultaneidad completamente fuera de control.Orquestar su mensaje de traspasos correctamente y usted debe tener todos los bits de tanto poder como si pudieras compartir el estado.Usted realmente no quiere que la alternativa que usted piensa que usted desea.

Otros consejos

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

Hay dos opciones para compartir los datos entre los trabajadores dedicados:

1. Compartida De Los Trabajadores

El SharedWorker interfaz representa un determinado tipo de trabajador que se puede acceder desde varios contextos de navegación, tales como varios de los windows, iframes o incluso de los trabajadores.

El desove comparten un Trabajador en un Dedicado Trabajador

2. Canal de la API de Mensajería

El Canal de la API de Mensajería permite separar los dos scripts que se ejecutan en diferentes contextos de navegación conectados a la misma de documento (por ejemplo, dos IFrames, o el documento principal y un IFrame, dos documentos a través de una SharedWorker, o dos trabajadores) para comunicarse directamente, pasando los mensajes entre uno y otro a través de camino de dos canales (o tubos) con un puerto en cada extremo.

Cómo llamar compartido trabajador de la web trabajador?

Recientemente he leído (pero no lo ha usado), compartida de los trabajadores.De acuerdo a Compartir el trabajo!La ópera viene con SharedWorker apoyo, el apoyo sólo en el más reciente de los navegadores (Opera 10.6, Chrome 5, Safari 5).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top