workers threads thread new example end chrome javascript multithreading web-worker

javascript - threads - web workers chrome



Degradando con gracia con los trabajadores web (7)

@ geowa4

//globals var useWorer={} ,noWorkerClosure=function(){...} ,myWorkerClosure=function(){...} ; function init(){ if(!!window.Worker){ noWorkerClosure=null; useWorer=new myWorkerClosure(); } else{ useWorer=new noWorkerClosure(); myWorkerClosure=null; } }

De esta manera usted libera algo de carga de memoria y no necesita solicitar soporte cada vez.

Así que estoy empezando a escuchar más y más sobre los Trabajadores Web . Creo que es absolutamente fantástico, pero la pregunta que no he visto abordar a nadie realmente es cómo admitir los navegadores más antiguos que aún no tienen soporte para la nueva tecnología.

La única solución que he podido encontrar hasta ahora es hacer algún tipo de envoltorio alrededor de la funcionalidad de los trabajadores web que recurra a alguna solución loca basada en temporizadores que simule la ejecución de múltiples subprocesos.

Pero incluso en ese caso, ¿cómo se detecta si los trabajadores web son una característica compatible del navegador que ejecuta actualmente el javascript?

¡Gracias!


Después de masticar esto por unos días, terminé escribiendo un artículo en mi blog:
http://codecube.net/2009/07/cross-platform-javascript-webworker/

La idea es que en los casos en los que WebWorker no esté definido, hay una API de envoltura que solo utiliza técnicas integradas. Aunque la muestra en el artículo es muy simple, funciona en todos los navegadores :-)


El proyecto Bespin tiene (lo que llaman) una facade que les permite ejecutar el código JavaScript en los Trabajadores Web, Trabajadores de Gears y si no están disponibles en el hilo principal.


Este es el viejo problema del desarrollo web: qué hacer con los navegadores que no son compatibles con lo que necesita. Actualmente, solo abogo por el uso de trabajadores web para tareas complejas y de larga ejecución que pueden dividirse, y por alguna razón, no se puede hacer desde el lado del servidor. De esta manera, si no tiene WebWorks, simplemente espere más tiempo. De lo contrario, tendría que hacer un lío de su código con los envoltorios y todo lo que tratará de evitar más adelante. Mi estrategia de degradación ocurre tan pronto como se carga la página.

pseudocódigo función onload

if( window.Worker /*check for support*/ ) someObject.myFunction = function() { /*algorithm that uses Web Workers*/ } else someObject.myFunction = function() { /* sad face */ }

Aún tiene que escribir el algoritmo dos veces, pero tendría que hacerlo de todos modos si desea admitir navegadores sin Web Workers. Entonces, surge una pregunta interesante: ¿vale la pena el tiempo (y el dinero) para escribir algo dos veces, solo para que pueda ir un poco más rápido para algunas personas?


Esto es lo que dijo John Resig en respuesta a un comentario en su blog.

Pensé en esto, pero será complicado. Tendría que hacer que su código de procesamiento use setTimeout / setInterval desde el principio (este código terminará trabajando tanto en un trabajador como en un sitio web normal). Entonces, si bien el resultado sería un poco más lento para los navegadores habilitados para trabajadores, al menos funcionaría en ambos casos.



Tuve el gracioso problema de que mi tarea sin el soporte de Web Worker era demasiado lenta en Firefox (secuencia de comandos que no responde), pero lo suficientemente rápida en todos los demás navegadores modernos. Con Web Workers funcionó en todos los navegadores, excepto Opera (10.50), que no es compatible con Web Workers, pero Opera funcionó bien sin ellos.

Así que escribí un WorkerFacade que usa la API de Web Worker cuando está disponible o falsifica la API con algunas adiciones menores al Worker JS real. Puedes encontrar WorkerFacade como una esencia en GitHub . Funcionó bien para mí, podría ayudar a alguien más, también.