Existe alguma maneira de executar multi-threading em JavaScript?
javascript
multithreading
Niyaz
fonte
fonte
Respostas:
Consulte http://caniuse.com/#search=worker para obter as informações de suporte mais atualizadas.
O seguinte foi o estado de apoio por volta de 2009.
As palavras para as quais você deseja pesquisar no Google são Threads de trabalho do JavaScript
Além do Gears, não há nada disponível no momento, mas há muita conversa sobre como implementar isso, então acho que assisto a essa pergunta, pois a resposta sem dúvida mudará no futuro.
Aqui está a documentação relevante para a API Gears: WorkerPool
O WHATWG possui um rascunho de recomendação para threads de trabalho: Trabalhadores da Web
E há também os threads de trabalho DOM da Mozilla
Atualização: junho de 2009, estado atual do suporte ao navegador para threads JavaScript
O Firefox 3.5 possui trabalhadores da web. Algumas demos dos trabalhadores da Web, se você quiser vê-los em ação:
O plug-in Gears também pode ser instalado no Firefox.
O Safari 4 e as diárias do WebKit têm threads de trabalho:
O Chrome tem o Gears instalado, para que ele possa executar threads, embora exija uma solicitação de confirmação do usuário (e use uma API diferente para os trabalhadores da Web, embora funcione em qualquer navegador com o plug-in Gears instalado):
O IE8 e o IE9 só podem fazer threads com o plug-in Gears instalado
fonte
Maneira diferente de executar multiencadeamento e assíncrono em JavaScript
Antes do HTML5, o JavaScript permitia apenas a execução de um thread por página.
Houve alguma forma hacky para simular uma execução assíncrono com Rendimento ,
setTimeout()
,setInterval()
,XMLHttpRequest
ou manipuladores de eventos (ver o fim deste post para um exemplo com rendimento esetTimeout()
).Mas com o HTML5, agora podemos usar Threads de Trabalho para paralelizar a execução de funções. Aqui está um exemplo de uso.
Multi-threading real
Multiencadeamento: Threads de trabalho do JavaScript
O HTML5 introduziu threads de trabalho da Web (consulte: compatibilidade de navegadores )
Nota: O IE9 e versões anteriores não o suportam.
Esses threads de trabalho são threads JavaScript executados em segundo plano sem afetar o desempenho da página. Para obter mais informações sobre o Web Worker, leia a documentação ou este tutorial .
Aqui está um exemplo simples com três threads de trabalho da Web que contam até MAX_VALUE e mostram o valor calculado atual em nossa página:
Podemos ver que os três threads são executados em simultâneo e imprimem seu valor atual na página. Eles não congelam a página porque são executados em segundo plano com threads separados.
Multiencadeamento: com vários iframes
Outra maneira de conseguir isso é usar vários iframes , cada um executando um encadeamento. Podemos fornecer ao iframe alguns parâmetros pelo URL e o iframe pode se comunicar com o pai ou mãe para obter o resultado e imprimi-lo novamente (o iframe deve estar no mesmo domínio).
Este exemplo não funciona em todos os navegadores! Os iframes geralmente são executados no mesmo encadeamento / processo da página principal (mas o Firefox e o Chromium parecem lidar com isso de maneira diferente).
Como o snippet de código não suporta vários arquivos HTML, fornecerei apenas os diferentes códigos aqui:
index.html:
thread.html:
Simular multiencadeamento
Encadeamento único: emule a simultaneidade do JavaScript com setTimeout ()
A maneira 'ingênua' seria executar a função
setTimeout()
uma após a outra assim:Mas esse método não funciona porque cada tarefa será executada uma após a outra.
Podemos simular a execução assíncrona chamando a função recursivamente assim:
Como você pode ver, este segundo método é muito lento e congela o navegador porque ele usa o thread principal para executar as funções.
Encadeamento único: emule a simultaneidade do JavaScript com rendimento
O rendimento é um novo recurso do ECMAScript 6 , que funciona apenas na versão mais antiga do Firefox e do Chrome (no Chrome, é necessário ativar o JavaScript experimental que aparece no chrome: // flags / # enable-javascript-harmony ).
Um gerador permite suspender a execução de uma função e retomar mais tarde. Um gerador pode ser usado para agendar suas funções com uma técnica chamada trampolim .
Aqui está o exemplo:
fonte
Com as "especificações laterais" do HTML5, não é mais necessário hackear o javascript com setTimeout (), setInterval () etc.
O HTML5 & Friends apresenta a especificação javascript dos Trabalhadores da Web . É uma API para executar scripts de forma assíncrona e independente.
Links para a especificação e um tutorial .
fonte
Não há verdadeiro encadeamento em JavaScript. O JavaScript, sendo a linguagem maleável, permite simular parte dela. Aqui está um exemplo que me deparei no outro dia.
fonte
Não há verdadeiro multiencadeamento no Javascript, mas você pode obter um comportamento assíncrono usando
setTimeout()
solicitações AJAX assíncronas.O que exatamente você está tentando realizar?
fonte
Aqui está apenas uma maneira de simular multi-threading em Javascript
Agora vou criar 3 threads que calcularão a adição de números, os números podem ser divididos com 13 e os números podem ser divididos com 3 até 10000000000. E essas 3 funções não podem ser executadas ao mesmo tempo que o que significa simultaneidade. Mas vou mostrar um truque que fará com que essas funções sejam executadas recursivamente ao mesmo tempo: jsFiddle
Este código pertence a mim.
Parte do corpo
Parte Javascript
Espero que assim seja útil.
fonte
Você pode usar o Narrative JavaScript , um compilador que transforma seu código em uma máquina de estado, permitindo efetivamente emular a segmentação. Isso é feito adicionando um operador "produtivo" (anotado como '->') ao idioma que permite escrever código assíncrono em um único bloco de código linear.
fonte
O novo motor v8 que deve sair hoje o suporta (eu acho)
fonte
No Javascript bruto, o melhor que você pode fazer é usar as poucas chamadas assíncronas (xmlhttprequest), mas isso não é realmente de encadeamento e muito limitado. O Google Gears adiciona várias APIs ao navegador, algumas das quais podem ser usadas para suporte de segmentação.
fonte
Se você não pode ou não deseja usar nada do AJAX, use um iframe ou dez! ;) Você pode ter processos em execução em iframes em paralelo à página mestre sem se preocupar com problemas comparáveis entre navegadores ou problemas de sintaxe com o dot net AJAX etc., e pode chamar o JavaScript da página mestre (incluindo o JavaScript que foi importado) de um iframe.
Por exemplo, em um iframe pai, para chamar
egFunction()
o documento pai depois que o conteúdo do iframe for carregado (essa é a parte assíncrona)Gere dinamicamente os iframes também, para que o código html principal fique livre deles, se desejar.
fonte
Outro método possível é usar um interpretador javascript no ambiente javascript.
Criando vários intérpretes e controlando sua execução a partir do encadeamento principal, você pode simular multiencadeamento com cada encadeamento em execução em seu próprio ambiente.
A abordagem é um pouco semelhante aos trabalhadores da Web, mas você concede ao intérprete acesso ao ambiente global do navegador.
Eu fiz um pequeno projeto para demonstrar isso .
Uma explicação mais detalhada nesta postagem do blog .
fonte
Javascript não tem threads, mas temos trabalhadores.
Os trabalhadores podem ser uma boa opção se você não precisar de objetos compartilhados.
A maioria das implementações de navegadores realmente espalhará trabalhadores por todos os núcleos, permitindo que você utilize todos os núcleos. Você pode ver uma demonstração disso aqui .
Eu desenvolvi uma biblioteca chamada task.js que facilita muito isso.
Um exemplo seria
fonte
Com a especificação HTML5, você não precisa escrever muito JS para o mesmo nem encontrar alguns hacks.
Um dos recursos introduzidos no HTML5 é o Web Workers, que é JavaScript em execução em segundo plano, independentemente de outros scripts, sem afetar o desempenho da página.
É suportado em quase todos os navegadores:
Chrome - 4.0 ou superior
IE - 10.0+
Mozilla - 3.5+
Safari - 4.0 ou superior
Opera - 11,5+
fonte