Quais são os casos de uso para Web Workers? [fechadas]

174

Estou procurando cenários reais para usar a API Web Workers .

Sergey Ilinsky
fonte
Eles são suportados por plataformas móveis / webkit?
dmp 5/05
Não sei ao certo, mas acho que sim.
Sergey Ilinsky 5/05
6
@danp Suporte ao navegador: caniuse.com/webworkers
Dheeraj Vepakomma
1
Eu escrevi um caso em que utilizado pela primeira vez um trabalhador web, então determinada estávamos melhor sem ela - windward.net/blogs/web-workers-abandon/#.Vl3QdXarQ-U
David Thielen

Respostas:

143
  • John Resig (da fama do jQuery) tem vários exemplos interessantes de uso de trabalhadores da Web aqui - jogos, gráficos, criptografia.

  • Outro uso é a E / S da Web - em outras palavras, pesquisar URLs em segundo plano. Dessa forma, você não bloqueia a interface do usuário aguardando resultados da pesquisa.

  • Outro uso prático: em Bespin, eles estão usando Web Workers para destacar a sintaxe, que você não deseja bloquear a edição de código enquanto estiver usando o aplicativo.

  • Do Mozilla : Uma maneira de os funcionários serem úteis é permitir que seu código realize cálculos intensivos em processador sem bloquear o segmento da interface do usuário.

    Como um exemplo prático, pense em um aplicativo com uma grande tabela de #s (este é o mundo real, BTW - retirado de um aplicativo que eu programei ~ 2 anos atrás). Você pode alterar um # em uma tabela via campo de entrada e vários outros números em colunas diferentes são recalculados em um processo bastante intenso.

    O fluxo de trabalho antigo era: Altere o #. Vá tomar um café enquanto o JavaScript processa alterações em outros números e a página da Web não responde por 3 minutos - depois que eu a otimizei para o inferno e para trás. Volte com café. Mude um segundo #. Repita várias vezes. Clique no botão SALVAR.

    O novo fluxo de trabalho com os trabalhadores pode ser: Altere o #. Receba uma mensagem de status informando que algo está sendo recalculado, mas você pode alterar outros #. Alterar mais #s. Quando terminar de alterar, aguarde até que o status seja alterado para "todos os cálculos concluídos, agora você pode revisar os nºs finais e salvar".

DVK
fonte
5
Ótimos links! Eu nunca tinha ouvido falar de Trabalhadores ... mmm, Trabalhadores. (Hora de ir tomar um banho longo e quente ...)
Peter Rowell
51
Sei que essa é uma resposta de dois anos, mas só quero mencionar que você não precisa do Web Workers para o item 2 (URLs de pesquisa). XHR acontece de forma assíncrona e não bloqueia; não há necessidade de executar solicitações XHR em um thread separado. (Claro que, em um aplicativo moderno que você gostaria de usar WebSockets em vez de votação.)
josh3736
6
@ josh3736 - Você está certo, mas agora estou curioso para saber se fazer muitas solicitações paralelas de XHR aync de alguma forma pode tornar o navegador infeliz? Além disso, você precisa de recursos locais para processar respostas XHR onde os trabalhadores possam ser úteis.
DVK
Se todas as solicitações paralelas forem para o mesmo servidor, você atingirá o limite por nome do host em algum lugar entre 2 e 9 conexões simultâneas. (Suponho que o limite se aplique a todas as conexões, iniciadas pelo thread principal ou por um trabalhador.) Obviamente, se você tiver 10 solicitações simultâneas em execução ao mesmo tempo, provavelmente precisará repensar o design do aplicativo.
precisa saber é o seguinte
2
Desculpe minha pergunta simples, mas a que você se refere como "#" no seu exemplo acima?
Shrewdbeans #
35

Eu os usei para enviar grandes quantidades de dados do navegador para o servidor. Obviamente, você pode fazer isso com chamadas AJAX regulares, mas se isso exigir uma das conexões preciosas por nome de host. Além disso, se o usuário fizer uma transição de página durante esse processo (por exemplo, clicar em um link), seus objetos JavaScript da página anterior desaparecerão e você não poderá processar retornos de chamada. Quando um trabalhador da Web é usado, essa atividade ocorre fora da banda, para que você tenha uma garantia melhor de que ela será concluída.

Kevin Hakanson
fonte
2
Mas você precisa trocar a mensagem com o trabalhador da web. Quando o custo desta operação merece o benefício?
precisa saber é o seguinte
6

Outro caso de uso:

Compactação / descompactação de arquivos em segundo plano, se você tiver muitas imagens e outros arquivos de mídia trocados do servidor em formato compactado.

sbr
fonte
39
Isso não deveria estar acontecendo em JavaScript. As imagens estão compactadas (PNG, JPEG) usando algoritmos projetados para compactar com eficiência os dados da imagem. Jogar outra camada de compressão por cima pode realmente aumentar o tamanho dos dados. Para outros tipos de dados (por exemplo, um arquivo JSON grande), a compactação deve ser manipulada pelo navegador usando gzip HTTP padrão. Se você estiver fazendo compressão em JavaScript, provavelmente está fazendo errado .
Josh3736 #
11
Eu vejo alguns usuários desqualificando o caso de uso, mas aqui está o que eu quis dizer. considere um aplicativo como o MS word, como um poderoso editor de documentos através do qual você pode incorporar imagens, arquivos de música, dados, planilhas do Excel etc. tudo em um arquivo. e considere que você tem um cliente baseado na Web e um cliente de desktop e um cliente IOS / Android. Para esse tipo de caso de uso, você pode armazenar todo o conteúdo do arquivo em um arquivo zip e descompactar em cada cliente.
sbr
3
O bookmarklet Instapaper compacta a página que está sendo salva antes de enviá-la ao servidor. Economiza tempo e largura de banda.
stevendaniels
12
@ josh3736 A única coisa que um navegador pode fazer é descompactar um arquivo de um servidor Web (ou cache do navegador). Ele não pode descompactar dados do armazenamento local, nem de um soquete da Web, e não pode compactar. Os aplicativos da Web estão enviando uma quantidade cada vez maior de dados a montante, e a compactação é extremamente útil. Igualmente válido há um ano, quando foi publicado: Se você não consegue pensar em nenhum caso de uso válido para a compressão JavaScript, provavelmente não tem imaginação.
Adria
1
@ Adria: O padrão websocket está no processo de adicionar suporte à compactação . Se você estiver lidando com imagens geradas no navegador ( <canvas>), poderá obter os dados da imagem em um formato compactado (por exemplo, png). Meu argumento não era que nunca é apropriado compactar em JS; o que quero dizer é que, na maioria dos casos , não é , e para a maioria dos casos - especialmente lidando com imagens, sobre o que essa resposta fala -, há uma alternativa melhor para fazer sua própria compactação.
josh3736