Pregunta

Así que tengo esta función recursiva en serio que me gustaría usar con mi código. La cuestión es que en realidad no se aprovechan de las máquinas de doble núcleo, porque js es de un solo subproceso. He intentado usar webworkers pero realmente no sabe mucho acerca de la programación multinúcleo. Ciertamente me punto a alguien a algún material que podría explicar cómo se hace. Busqué en Google para encontrar esta grabación enlace pero no es realmente de mucha ayuda sin la documentación! = /

Yo sería feliz si alguien me podría mostrar cómo esto podría hacerse sin webworkers aunque! Eso sería increíble! =)

Me encontré con este enlace en WHATWG . Esto es muy raro porque explica cómo utilizar múltiples núcleos de programación en webworkers etc, pero en la ejecución en mi navegador Chrome que arroja errores. Lo mismo ocurre con otros navegadores.

Error: 9Uncaught ReferenceError: Trabajador no se define en worker.js

¿Fue útil?

Solución

ACTUALIZACIÓN (06/21/2018) : Para las personas que vienen aquí en busca de la programación multi-núcleo en JavaScript, no necesariamente navegador JavaScript (para eso, la respuesta sigue siendo válida como está ): Node.js ahora es compatible con múltiples hilos detrás de un indicador de la función (--experimental-workers): información de la liberación , cuestión relevante .


Escribir este de la parte superior de mi cabeza, no hay garantías de código fuente. Por favor, vaya fácil en mí.

Por lo que yo sé, no se puede realmente programa en las discusiones con JavaScript. Webworkers son una forma de multi-programación; sin embargo, JavaScript es por su naturaleza de un solo subproceso (basado en un bucle de eventos).

A Webworker es independiente hilo de ejecución en el sentido de que no comparte nada con el guión que empezó; no hay una referencia al objeto global de la secuencia de comandos (normalmente llamado "ventana" en el navegador), y no hay referencia a ninguna de las variables de la secuencia de comandos principal distintos de los datos que envíe al hilo.

Piense que el trabajador web como un poco de "servidor" que consigue hizo una pregunta y proporciona una respuesta. Sólo se puede enviar cadenas a ese servidor, y sólo se puede analizar la cadena y enviar de vuelta lo que se ha calculado.

// in the main script, one starts a worker by passing the file name of the 
// script containing the worker to the constructor. 
var w = new Worker("myworker.js");

// you want to react to the "message" event, if your worker wants to inform
// you of a result. The function typically gets the event as an argument. 
w.addEventListener("message",
    function (evt) {
        // process evt.data, which is the message from the 
        // worker thread
        alert("The answer from the worker is " + evt.data);
    });

A continuación, puede enviar un mensaje (una cadena) a este hilo usando su postMessage () - Método:

w.postMessage("Hello, this is my message!");

Una secuencia de comandos trabajador de la muestra (un servidor de "eco") puede ser:

// this is another script file, like "myworker.js"
self.addEventListener("message", 
    function (evt) {
        var data = JSON.parse(evt.data);
        /* as an echo server, we send this right back */
        self.postMessage(JSON.stringify(data))
    })

lo que publique en ese hilo será decodificado, re-codificado y enviado de vuelta. por supuesto, puede hacer lo que el procesamiento que querría hacer en el medio. Ese trabajador permanecerá activo; puede llamar terminate() en ella (en el script principal; eso sería w.terminate()). terminarla o llamando self.close() en su trabajador

Para resumir : lo que puede hacer es subir el cierre de sus parámetros de función en una cadena JSON, que se envía utilizando postMessage, decodifica y procesa "en el otro lado" (en el trabajo). El resultado del cálculo es enviado de vuelta a su script "principal".

Para explicar por qué esto no es fácil : Más interacción no es realmente posible, y que la limitación es intencional. Dado que los recursos compartidos (un objeto visible para el trabajador y el guión principal) estarían sujetas a dos hilos que interfieren con ellos, al mismo tiempo, que tendría que administrar el acceso (es decir, de bloqueo) a ese recurso con el fin de evitar condiciones de carrera .

El paso de mensajes, nada compartida enfoque no es tan conocida sobre todo porque la mayoría de otros lenguajes de programación (C y Java por ejemplo) los hilos de uso que operan en el mismo espacio de direcciones (mientras que otros, como Erlang, por ejemplo, no lo hacen). Considere lo siguiente:

  • realmente difícil de código de un proyecto más amplio con el mutex (un mecanismo de exclusión mutua) debido a la condición complejidades estancamiento / carreras asociadas. Esto es algo que puede hacer que los hombres crecido grito!
  • realmente fácil en comparación a hacer de paso de mensajes, compartir nada semántica. El código está aislado; usted sabe exactamente lo que sucede en su trabajador y lo que sale de su trabajador. Bloqueo de puertas y condiciones de carrera son imposible para lograr!

Sólo probarlo; que es capaz de hacer cosas interesantes, probablemente todo lo que desea. Tenga en cuenta que se trata de Todavía define si la aplicación se aprovecha de múltiples núcleos por lo que yo sé.

NB. Me acaban informado de que al menos algunos implementaciones se encargará de JSON codificación de mensajes para usted.

Por lo tanto, para dar una respuesta a su pregunta (es todo arriba; tl; dr versión): No, no se puede hacer esto sin los trabajadores web. Pero no hay nada realmente mal acerca de los trabajadores web ASIde apoyo del navegador, como es el caso de HTML5 en general.

Otros consejos

Por lo que yo recuerdo esto sólo es posible con el nuevo estándar HTML5. La palabra clave es "Web-trabajador"

Ver también:

HTML5: JavaScript Web Workers

JavaScript roscar con HTML5 Web Workers

trabajadores Web son la respuesta a la parte del cliente. Para NodeJS hay muchos enfoques. Más populares - varios procesos de regeneración con pm2 o una herramienta similar. Ejecutar los procesos hijo / horquilla de regeneración y único proceso. Puede google en torno a estos y encontrará una gran cantidad de muestras y tácticas.

trabajadores Web ya están bien soportados por todos los navegadores. https://caniuse.com/#feat=webworkers

API y muestras: https: //developer.mozilla .org / es-eS / docs / web / API / Web_Workers_API / Using_web_workers

introducir descripción de la imagen aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top