¿Hay alguna manera de hacer subprocesos múltiples en JavaScript?
javascript
multithreading
Niyaz
fuente
fuente
Respuestas:
Consulte http://caniuse.com/#search=worker para obtener la información de soporte más actualizada.
El siguiente fue el estado de apoyo alrededor de 2009.
Las palabras que desea buscar en google son JavaScript Worker Threads
Además de Gears, no hay nada disponible en este momento, pero se habla mucho sobre cómo implementar esto, así que supongo que observe esta pregunta, ya que la respuesta sin duda cambiará en el futuro.
Aquí está la documentación relevante para Gears: API WorkerPool
WHATWG tiene un borrador de recomendación para hilos de trabajo: Web Workers
Y también hay hilos de trabajo DOM de Mozilla
Actualización: junio de 2009, estado actual del soporte del navegador para hilos JavaScript
Firefox 3.5 tiene trabajadores web. Algunas demostraciones de trabajadores web, si quieres verlos en acción:
El complemento Gears también se puede instalar en Firefox.
Safari 4 y los nightlies de WebKit tienen hilos de trabajo:
Chrome tiene Gears incorporados, por lo que puede hacer hilos, aunque requiere una confirmación del usuario (y utiliza una API diferente para los trabajadores web, aunque funcionará en cualquier navegador con el complemento Gears instalado):
IE8 e IE9 solo pueden hacer hilos con el complemento Gears instalado
fuente
Manera diferente de hacer subprocesos múltiples y asíncrono en JavaScript
Antes de HTML5, JavaScript solo permitía la ejecución de un hilo por página.
Hubo alguna manera hacky para simular una ejecución asíncrona con Rendimiento ,
setTimeout()
,setInterval()
,XMLHttpRequest
o controladores de eventos (véase el final de este post para un ejemplo con rendimiento ysetTimeout()
).Pero con HTML5 ahora podemos usar Worker Threads para paralelizar la ejecución de funciones. Aquí hay un ejemplo de uso.
Real multihilo
Multi-threading: JavaScript Worker Threads
HTML5 introdujo Web Worker Threads (ver: compatibilidad de navegadores )
Nota: IE9 y versiones anteriores no lo admiten.
Estos hilos de trabajo son hilos de JavaScript que se ejecutan en segundo plano sin afectar el rendimiento de la página. Para obtener más información sobre Web Worker, lea la documentación o este tutorial .
Aquí hay un ejemplo simple con 3 hilos de Web Worker que cuentan hasta MAX_VALUE y muestran el valor calculado actual en nuestra página:
Podemos ver que los tres hilos se ejecutan en concurrencia e imprimen su valor actual en la página. No congelan la página porque se ejecutan en segundo plano con hilos separados.
Multihilo: con múltiples iframes
Otra forma de lograr esto es usar múltiples iframes , cada uno ejecutará un hilo. Podemos proporcionarle al iframe algunos parámetros mediante la URL y el iframe puede comunicarse con su padre para obtener el resultado e imprimirlo de nuevo (el iframe debe estar en el mismo dominio).
¡Este ejemplo no funciona en todos los navegadores! Los iframes generalmente se ejecutan en el mismo hilo / proceso que la página principal (pero Firefox y Chromium parecen manejarlo de manera diferente).
Dado que el fragmento de código no admite varios archivos HTML, solo proporcionaré los diferentes códigos aquí:
index.html:
thread.html:
Simular subprocesos múltiples
Subproceso único: emule la concurrencia de JavaScript con setTimeout ()
La forma 'ingenua' sería ejecutar la función
setTimeout()
una tras otra de esta manera:Pero este método no funciona porque cada tarea se ejecutará una tras otra.
Podemos simular la ejecución asincrónica llamando a la función de forma recursiva de esta manera:
Como puede ver, este segundo método es muy lento y congela el navegador porque usa el hilo principal para ejecutar las funciones.
Subproceso único: emule la concurrencia de JavaScript con el rendimiento
El rendimiento es una nueva característica en ECMAScript 6 , solo funciona en la versión más antigua de Firefox y Chrome (en Chrome necesita habilitar JavaScript experimental que aparece en chrome: // flags / # enable-javascript-harmony ).
Un generador le permite suspender la ejecución de una función y reanudarla más tarde. Se puede usar un generador para programar sus funciones con una técnica llamada trampolín .
Aquí está el ejemplo:
fuente
Con las "especificaciones laterales" HTML5 ya no es necesario hackear javascript con setTimeout (), setInterval (), etc.
HTML5 & Friends presenta la especificación de JavaScript Web Workers . Es una API para ejecutar scripts de forma asincrónica e independiente.
Enlaces a la especificación y un tutorial .
fuente
No hay hilos verdaderos en JavaScript. Siendo JavaScript el lenguaje maleable que es, le permite emular parte de él. Aquí hay un ejemplo que encontré el otro día.
fuente
No hay verdadero subprocesamiento múltiple en Javascript, pero puede obtener un comportamiento asincrónico utilizando
setTimeout()
solicitudes AJAX asincrónicas.¿Qué es exactamente lo que estás tratando de lograr?
fuente
Aquí hay una manera de simular múltiples subprocesos en Javascript
Ahora voy a crear 3 hilos que calcularán la suma de números, los números se pueden dividir con 13 y los números se pueden dividir con 3 hasta 10000000000. Y estas 3 funciones no pueden ejecutarse al mismo tiempo que lo que significa Concurrencia. Pero te mostraré un truco que hará que estas funciones se ejecuten de forma recursiva al mismo tiempo: jsFiddle
Este código me pertenece
Parte del cuerpo
Parte Javascript
Espero que de esta manera sea útil.
fuente
Podría usar Narrative JavaScript , un compilador que transformará su código en una máquina de estados, lo que le permitirá emular los subprocesos. Lo hace agregando un operador "productivo" (anotado como '->') al lenguaje que le permite escribir código asincrónico en un único bloque de código lineal.
fuente
El nuevo motor v8 que debería salir hoy lo admite (creo)
fuente
En Javascript sin procesar, lo mejor que puede hacer es usar las pocas llamadas asincrónicas (xmlhttprequest), pero eso no es realmente subprocesamiento y muy limitado. Google Gears agrega una serie de API al navegador, algunas de las cuales se pueden usar para la compatibilidad con subprocesos.
fuente
Si no puede o no quiere usar nada de AJAX, ¡use un iframe o diez! ;) Puede tener procesos ejecutándose en iframes en paralelo con la página maestra sin preocuparse por problemas comparables entre navegadores o problemas de sintaxis con dot net AJAX, etc., y puede llamar al JavaScript de la página maestra (incluido el JavaScript que ha importado) desde un iframe
Por ejemplo, en un iframe padre, para llamar
egFunction()
al documento padre una vez que se ha cargado el contenido del iframe (esa es la parte asincrónica)Genere dinámicamente los iframes también para que el código html principal esté libre de ellos si lo desea.
fuente
Otro método posible es utilizar un intérprete de JavaScript en el entorno de JavaScript.
Al crear múltiples intérpretes y controlar su ejecución desde el hilo principal, puede simular múltiples hilos con cada hilo ejecutándose en su propio entorno.
El enfoque es algo similar a los trabajadores web, pero le da al intérprete acceso al entorno global del navegador.
Hice un pequeño proyecto para demostrar esto .
Una explicación más detallada en esta publicación de blog .
fuente
Javascript no tiene hilos, pero tenemos trabajadores.
Los trabajadores pueden ser una buena opción si no necesita objetos compartidos.
La mayoría de las implementaciones de navegador en realidad distribuirán trabajadores en todos los núcleos, lo que le permitirá utilizar todos los núcleos. Puedes ver una demostración de esto aquí .
He desarrollado una biblioteca llamada task.js que hace que esto sea muy fácil de hacer.
Un ejemplo sería
fuente
Con la especificación HTML5 no necesita escribir demasiado JS para el mismo o encontrar algunos hacks.
Una de las características introducidas en HTML5 es Web Workers que es JavaScript que se ejecuta en segundo plano, independientemente de otros scripts, sin afectar el rendimiento de la página.
Es compatible con casi todos los navegadores:
Chrome - 4.0+
IE - 10.0+
Mozilla - 3.5+
Safari - 4.0+
Opera - 11.5+
fuente