Pergunta

É uma deliberada decisão de design ou um problema com o nosso atual dia de navegadores que vai ser corrigido nas próximas versões?

Foi útil?

Solução

JavaScript não oferece suporte a multi-threading porque o interpretador JavaScript no navegador é um único thread (AFAIK).Até mesmo o Google Chrome não vai permitir que uma única página da web em JavaScript de são executados simultaneamente, pois isso poderia causar enormes problemas de simultaneidade em páginas da web existentes.Todos Chrome faz é separar os vários componentes (guias diferentes, plugins, etc.) em processos separados, mas eu não consigo imaginar uma única página de ter mais de um JavaScript thread.

No entanto, pode usar, como foi sugerido, setTimeout para permitir algum tipo de agendamento e "falso" de simultaneidade.Isso faz com que o browser para recuperar o controle da prestação de thread, e iniciar o código JavaScript fornecido para setTimeout depois de um dado número de milissegundos.Isto é muito útil se você deseja permitir que o visor (o que você vê) para atualizar durante a realização de operações sobre ele.Apenas um loop através e.g.coordenadas e atualização de um elemento de acordo só vai permitir que você veja as posições inicial e final, e nada entre.

Nós usamos uma abstração biblioteca em JavaScript que permite criar processos e threads que são todos gerenciados pelo mesmo interpretador JavaScript.Isto permite-nos executar ações da seguinte forma:

  • Um Processo, Thread 1
  • Um Processo, Thread 2
  • O Processo B, O Thread 1
  • Um Processo, Thread 3
  • Um Processo, Thread 4
  • O Processo B, Thread 2
  • Pausar Um Processo De
  • Processo B, A Thread 3
  • Processo B, A Thread 4
  • Processo B, A Thread 5
  • Iniciar Um Processo De
  • Um Processo, Thread 5

Isto permite alguma forma de agendamento e falsificações paralelismo, partida e parada de threads, etc, etc, mas não vai ser verdadeiro multi-threading.Eu não acho que nunca vai ser implementado na linguagem em si, uma vez que o verdadeiro multi-threading é útil apenas se o navegador pode executar uma única página de multi-threaded (ou até mesmo mais de um núcleo), e as dificuldades não são maiores do que as possibilidades adicionais.

Para o futuro de JavaScript, confira:https://developer.mozilla.org/presentations/xtech2006/javascript/

Outras dicas

Tradicionalmente, JS foi destinado a curto e de rápida execução de trechos de código.Se você teve grandes cálculos acontecendo, não é em um servidor - a idéia de um JS+HTML aplicação , que correu no seu browser para longos períodos de tempo, fazendo não-trivial de coisas foi um absurdo.

É claro, agora nós temos isso.Mas, vai demorar um pouco para navegadores apanhar - a maioria delas foi projetada em torno de um modelo single-threaded, e mudar isso não é fácil.O Google Gears lado-etapas de um monte de problemas em potencial, exigindo a execução de plano de fundo é isolado - não alterar o DOM (uma vez que não é thread-safe), não aceder a objectos criados pela thread principal (idem).Enquanto restritivas, esse provavelmente vai ser o mais prático de design para o futuro próximo, tanto porque ele simplifica o design do browser, e porque reduz o risco envolvido em permitir inexperiente JS codificadores de mexer com threads...

@marcio:

Por que é que um motivo para não implementar multi-threading em Javascript?Os programadores podem fazer o que querem com as ferramentas que têm.

Então, não vamos dar-lhes as ferramentas que são tão fáceis de uso indevido o que cada site que eu abrir acaba de cair no meu navegador.Uma implementação simples de trazer direto para o território que causou MS tantas dores de cabeça durante o IE7 desenvolvimento:add-on autores jogado rápido e solto com o modelo de threading, resultando em bugs escondidos que se tornou evidente quando o objeto ciclos de vida alterado no thread principal.MAU.Se você estiver escrevendo multi-threaded ActiveX add-ons para o IE, eu acho que isso vem com o território;não significa que ele precisa de ir mais longe do que isso.

JavaScript multi-threading (com algumas limitações) está aqui.O Google implementou trabalhadores para Mudanças, e os trabalhadores estão sendo incluídos com o HTML5.A maioria dos navegadores já adicionado suporte para esse recurso.

Thread-a segurança dos dados é garantida, pois todos os dados comunicados de/para o trabalhador é serializado/copiado.

Para mais informações, leia:

http://www.whatwg.org/specs/web-workers/current-work/

http://ejohn.org/blog/web-workers/

Eu não sei a justificativa para esta decisão, mas eu sei que você pode simular alguns dos benefícios de programação multi-threaded usando setTimeout.Você pode dar a ilusão de vários processos, fazendo as coisas ao mesmo tempo, embora, na realidade, tudo acontece em uma thread.

Apenas tem a função de fazer um pouco de trabalho, e, em seguida, chamar algo como:

setTimeout(function () {
    ... do the rest of the work...
}, 0);

E quaisquer outras coisas que precisa fazer (como atualizações de INTERFACE do usuário, imagens animadas, etc) vai acontecer quando receber uma chance.

Multithread.js envolve Web Trabalhadores e permite fácil de multithreading em JS.Funciona em todos os novos navegadores, incluindo iOS Safari.:)

Você quer dizer por que não o suporte de idioma multithreading ou por que não mecanismos de JavaScript em navegadores oferecem suporte a multithreading?

A resposta para a primeira pergunta é que o JavaScript no navegador é concebido para ser executado em uma caixa de areia e em uma máquina/OS-independentes, para adicionar suporte para multithreading iria complicar a linguagem e amarrar o idioma muito de perto para o sistema operacional.

Assim como matt b disse, a questão não é muito clara.Supondo que você está perguntando sobre o suporte para multithreading na língua:porque ele não é necessário para a 99,999% das aplicações em execução no navegador atualmente.Se você realmente precisa dele, existem soluções alternativas (como a utilização de janela.setTimeout).

Em geral multithreading é muito, muito, muito, muito, muito, muito difícil (eu diria que é difícil?) para ter direito, a menos que você coloque em restrições extras (como a utilização de apenas imutável de dados).

A Intel tem feito alguns abrir-fonte de pesquisa sobre o multithreading em Javascript, que foi apresentado recentemente na GDC 2012.Aqui está o link para o vídeo.O grupo de pesquisa utilizado OpenCL, que se concentra principalmente na Intel chipsets e sistema operacional Windows.O projeto é de código-nomeado RiverTrail e o código está disponível no GitHub

Mais alguns links úteis:

A construção de uma Computação Estrada para Aplicativos da Web

Atualmente, alguns navegadores oferecem suporte a multithreading.Então, se você precisa que você pode usar bibliotecas específicas.Por exemplo, ver o seguinte materiais:

Node.js 10.5+ suporte threads de trabalho como recurso experimental (você pode usá-lo com --experimental-trabalhadores sinalizador activado): https://nodejs.org/api/worker_threads.html

Assim, a regra é a seguinte:

  • se o que você precisa fazer I/O bound ops, e , em seguida, usar o mecanismo interno (aka retorno de chamada/promessa/async-aguarde)
  • se o que você precisa fazer CPU bound ops, e , em seguida, usar threads de trabalho.

Threads de trabalho destinam-se a ser de longa vida threads, ou seja, você expandir um segmento de plano de fundo e, em seguida, você se comunicar com ele através de passagem de mensagens.

Caso contrário, se você precisar executar uma carga de CPU elevada com uma função anônima, então você pode ir com https://github.com/wilk/microjob, uma pequena biblioteca construída em torno de threads de trabalho.

É a implementações que não oferece suporte a multi-threading.Atualmente o Google Gears é fornecer uma maneira de usar alguma forma de concorrência, através da execução de processos externos, mas que é sobre ele.

O novo navegador do Google é suposto lançamento de hoje (Google Chrome) executa o código em paralelo, separando-lo no processo.

O idioma principal, é claro, pode ter o mesmo suporte, dizer que Java, mas o suporte para algo como Erlang simultaneidade é nada perto do horizonte.

Tanto quanto eu tenho heared o Google Chrome vai ter multithread javascript, então ele é um "implementações atuais" problema.

De acordo com a este artigo já é possível implementar o JavaScript threading.

Sem o adequado suporte de idioma para o segmento de sincronização, ele não faz muito sentido para novas implementações para tentar.Existente complexo JS aplicações (e.g.qualquer coisa usando o ExtJS) seria mais provável falhar inesperadamente, mas sem uma synchronized palavra-chave ou algo semelhante, ele também seria muito difícil ou até mesmo impossível para escrever novos programas que se comportam corretamente.

No entanto, você pode usar a função eval para trazer concorrência PARA ALGUNS MEDIDA

/* content of the threads to be run */
var threads = [
        [
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');"
        ],
        [
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');"
        ]
    ];

window.onload = function() {
    var lines = 0, quantum = 3, max = 0;

    /* get the longer thread length */
    for(var i=0; i<threads.length; i++) {
        if(max < threads[i].length) {
            max = threads[i].length;
        }
    }

    /* execute them */
    while(lines < max) {
        for(var i=0; i<threads.length; i++) {
            for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) {
                eval(threads[i][j]);
            }
        }
        lines += quantum;
    }
}

você pode usar jetworker, wrapper no webworker https://github.com/uxitten/jetworker

Multi-threading com o javascript é claramente possível, utilizando webworkers trazer pelo HTML5.

A principal diferença entre webworkers e um padrão multi-threading ambiente recursos de memória não são compartilhados com a thread principal, uma referência a um objeto não é visível a partir de um segmento para outro.Threads de se comunicar através da troca de mensagens, portanto, é possível implementar um synchronzization e simultâneas chamada de método algoritmo a seguir um event-driven design pattern.

Muitos quadros de existir, permitindo que a estrutura de programmation entre segmentos, entre eles OODK-JS, uma OOP framework js apoio: programação concorrente https://github.com/GOMServices/oodk-js-oop-for-js

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