Pergunta

Existe alguma maneira de compartilhar uma variável entre dois web workers?(Web workers são basicamente threads em Javascript)

Em linguagens como c# você tem:

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

Eu sei que isso é um mau exemplo, mas no meu aplicativo Javascript, tenho um thread fazendo cálculos pesados ​​que podem ser espalhados por vários threads [já que tenho uma grande quantidade de dados na forma de um array.Todos os elementos do array são independentes uns dos outros.Em outras palavras, meus threads de trabalho não precisam se preocupar com bloqueios ou algo parecido]

Descobri que a única maneira de "compartilhar" uma variável entre dois threads seria criar um Getter/setter [via prototipagem] e então usar postMessage/onmessage...embora isso pareça realmente ineficiente [especialmente com objetos, que tenho que usar JSON para AFAIK]

LocalStorage/Database foi retirado da especificação HTML5 porque poderia resultar em impasses, então essa não é uma opção [infelizmente]...

A outra possibilidade que encontrei foi usar PHP para realmente ter páginas getVariable.php e setVariable.php, que usam armazenamento local para armazenar ints/strings...mais uma vez, os objetos [que incluem arrays/null] devem ser convertidos para JSON...e mais tarde, JSON.parse()'d.

Até onde eu sei, os threads de trabalho Javascript são totalmente isolados do thread da página principal [é por isso que os threads de trabalho Javascript não podem acessar os elementos DOM

Embora postMessage funcione, é lento.

Foi útil?

Solução

Os trabalhadores da Web são deliberadamente compartilhados sem nada - tudo em um trabalhador fica completamente oculto de outros trabalhadores e das páginas do navegador.Se houvesse alguma maneira de compartilhar valores não “atômicos” entre trabalhadores, a semântica desses valores seria quase impossível de usar com resultados previsíveis.Agora um poderia introduzir bloqueios como uma forma de usar tais valores, até certo ponto - você adquire o bloqueio, examina e talvez modifica o valor, então libera o bloqueio - mas os bloqueios são muito complicados de usar, e como o modo de falha usual é o deadlock você seria capaz de "bloquear" o navegador com bastante facilidade.Isso não é bom para desenvolvedores ou usuários (especialmente quando você considera que o ambiente web é tão propício à experimentação por não-programadores que nunca ouviram falar de threads, bloqueios ou passagem de mensagens), então a alternativa é nenhum estado compartilhado entre trabalhadores ou páginas no navegador.Você pode passar mensagens (que podem ser consideradas serializadas "over the wire" para o trabalhador, que então cria sua própria cópia do valor original com base nas informações serializadas) sem precisar resolver nenhum desses problemas.

Na verdade, a passagem de mensagens é o caminho certo para apoiar o paralelismo sem deixar que os problemas de simultaneidade fiquem completamente fora de controle.Orquestre suas transferências de mensagens corretamente e você terá tanto poder quanto se pudesse compartilhar o estado.Você realmente não quer a alternativa que pensa que quer.

Outras dicas

Não, mas você pode enviar mensagens para web workers que podem ser arrays, objetos, números, strings, booleanos e ImageData ou qualquer combinação destes.Os trabalhadores da Web também podem enviar mensagens de volta.

Existem duas opções para compartilhar dados entre trabalhadores dedicados:

1. Trabalhadores Compartilhados

A interface do SharedWorker representa um tipo específico de trabalhador que pode ser acessado a partir de vários contextos de navegação, como várias janelas, iframes ou até trabalhadores.

Gerando um trabalhador compartilhado em um trabalhador dedicado

2. API de mensagens do canal

A API de mensagens de canal permite dois scripts separados em execução em diferentes contextos de navegação anexados ao mesmo documento (por exemplo, dois iframes ou o documento principal e um iframe, dois documentos por meio de um trabalhador compartilhado ou dois trabalhadores) para se comunicar diretamente, passando mensagens entre uma outro a canais (ou tubos) de duas vias com uma porta em cada extremidade.

Como chamar o trabalhador compartilhado do web trabalhador?

Li recentemente sobre (mas não usei), trabalhadores compartilhados.De acordo com Compartilhe o trabalho!Opera vem com suporte SharedWorker, o suporte está disponível apenas nos navegadores mais recentes (Opera 10.6, Chrome 5, Safari 5).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top