¿Cuáles son los casos de uso para los trabajadores web? [cerrado]

174

Estoy buscando un escenario real para el uso de la API de Web Workers .

Sergey Ilinsky
fuente
¿Son compatibles con plataformas móviles / webkit?
dmp
No estoy seguro, pero supongo que sí.
Sergey Ilinsky
66
@danp Soporte del navegador: caniuse.com/webworkers
Dheeraj Vepakomma
1
Escribí un caso en el que usamos por primera vez un trabajador web, luego determiné que estábamos mejor sin él - windward.net/blogs/web-workers-abandon/#.Vl3QdXarQ-U
David Thielen

Respuestas:

143
  • John Resig (de la fama de jQuery) tiene un montón de ejemplos interesantes del uso de trabajadores web aquí : juegos, gráficos, criptografía.

  • Otro uso es la E / S web; en otras palabras, sondear URL en segundo plano. De esa manera no bloquea la interfaz de usuario a la espera de resultados de sondeo.

  • Otro uso práctico: en Bespin, están utilizando Web Workers para resaltar la sintaxis, que no desearía bloquear su edición de código mientras usa la aplicación.

  • Desde Mozilla : Una forma en que los trabajadores son útiles es permitir que su código realice cálculos intensivos en el procesador sin bloquear el hilo de la interfaz de usuario.

    Como ejemplo práctico, piense en una aplicación que tiene una gran tabla de #s (esto es del mundo real, por cierto, tomado de una aplicación que programé hace ~ 2 años). Puede cambiar un # en una tabla a través del campo de entrada y un montón de otros números en diferentes columnas se vuelven a calcular en un proceso bastante intenso.

    El antiguo flujo de trabajo era: Cambiar el #. Ve a tomar un café mientras JavaScript procesa los cambios a otros números y la página web no responde durante 3 minutos, después de que lo optimicé al infierno y viceversa. Vuelve con café. Cambiar un segundo #. Repite muchas veces. Haga clic en el botón GUARDAR.

    El nuevo flujo de trabajo con los trabajadores podría ser: Cambiar el #. Obtenga un mensaje de estado de que se está recalculando algo, pero puede cambiar otros #. Cambiar más #s. Cuando termine de cambiar, espere hasta que el estado cambie a "todos los cálculos completos, ahora puede revisar los números finales y guardar".

DVK
fuente
55
Grandes enlaces! Nunca había oído hablar de los trabajadores ... mmm, trabajadores. (Es hora de ir a tomar una ducha larga y caliente ...)
Peter Rowell
51
Sé que esta es una respuesta de hace dos años, pero solo quería mencionar que no debería necesitar Web Workers para el elemento # 2 (URL de sondeo). XHR ocurre de forma asincrónica y no se bloquea; no es necesario ejecutar solicitudes XHR en un hilo separado. (Por supuesto, en una aplicación moderna desearía usar WebSockets en lugar de sondeo)
Josh3736
66
@ josh3736 - Tienes razón, pero ahora tengo curiosidad por saber si hacer muchas solicitudes de XHR aync paralelas puede hacer que el navegador sea infeliz de alguna manera. Además, necesita recursos locales para procesar respuestas XHR donde los trabajadores puedan ser útiles.
DVK
Si todas las solicitudes paralelas son al mismo servidor, alcanzará el límite por nombre de host en algún lugar entre 2 y 9 conexiones simultáneas. (Supongo que el límite se aplica a todas las conexiones, ya sea que se inicie desde el subproceso principal o un trabajador). Por supuesto, si tiene 10 solicitudes simultáneas ejecutándose al mismo tiempo, probablemente deba repensar el diseño de su aplicación.
josh3736
2
Disculpe mi simple pregunta, pero ¿a qué se refiere como "#" en su ejemplo anterior?
shrewdbeans
35

Los he usado para enviar grandes cantidades de datos desde el navegador al servidor. Obviamente, puede hacer esto con llamadas AJAX regulares, pero si esto ocupa una de las conexiones preciosas por nombre de host. Además, si el usuario realiza una transición de página durante este proceso (por ejemplo, hace clic en un enlace), sus objetos JavaScript de la página anterior desaparecen y no puede procesar devoluciones de llamada. Cuando se utiliza un trabajador web, esta actividad ocurre fuera de banda, por lo que tiene una mejor garantía de que se completará.

Kevin Hakanson
fuente
2
Pero debe intercambiar el mensaje con el trabajador web. ¿Cuándo el costo de esta operación merece el beneficio?
Danielo515
6

Otro caso de uso:

Comprimir / descomprimir archivos en segundo plano, si tiene muchas imágenes y otros archivos multimedia que se intercambian desde el servidor en formato comprimido.

sbr
fuente
39
Esto no debería estar sucediendo en JavaScript. Las imágenes ya están comprimidas (PNG, JPEG) utilizando algoritmos diseñados para comprimir eficientemente los datos de la imagen. Lanzar otra capa de compresión encima puede aumentar el tamaño de los datos. Para otros tipos de datos (por ejemplo, un archivo JSON grande), la compresión debe ser manejada por el navegador utilizando el gzipping HTTP estándar. Si está haciendo compresión en JavaScript, probablemente lo esté haciendo mal .
josh3736
11
Veo que algunos usuarios descalifican el caso de uso, pero esto es lo que quise decir. considere una aplicación como MS Word, como un potente editor de documentos a través del cual puede incrustar imágenes, archivos de música, datos, hojas de Excel, etc., todo en UN archivo. y considere que tiene un cliente basado en la web y un cliente de escritorio y un cliente IOS / Android. Para este tipo de caso de uso, puede almacenar todo el contenido del archivo en un archivo zip y luego descomprimirlo en cada cliente.
sbr
3
El bookmarklet Instapaper comprime la página que se está guardando antes de enviarla al servidor. Ahorra tiempo y ancho de banda.
stevendaniels
12
@ josh3736 Lo único que puede hacer un navegador es descomprimir un archivo de un servidor web (o caché del navegador). No puede descomprimir datos del almacenamiento local, ni de un websocket, y no puede comprimir en absoluto. Las aplicaciones web envían una cantidad cada vez mayor de datos ascendentes, y la compresión para esto es extremadamente útil. Igualmente válido hace un año cuando se publicó esto: si no puede pensar en ningún caso de uso válido para la compresión de JavaScript, probablemente le falte imaginación.
Adria
1
@Adria: el estándar websocket está en proceso de agregar soporte de compresión . Si se trata de imágenes generadas en el navegador ( <canvas>), puede obtener los datos de la imagen en un formato comprimido (es decir, png). Mi punto no fue que nunca es apropiado comprimir en JS; mi punto es que en la mayoría de los casos , es no , y para la mayoría de los casos - sobre todo tratando con imágenes, que es lo que esta respuesta habla de - hay una mejor alternativa a rodar su propia compresión.
josh3736