Digamos que tengo un archivo de WebWorker llamado ticker.js que consiste en esto:
function tick() { postMessage(1); } setInterval(tick, 1);Y luego, en el programa principal de JavaScript, tenía esto:
let ready = true; let prevTime = 0; function sometimesLongTask() { ready = false; if (performance.now() - prevTime > 30) { // a very long CPU intensive task, like a loop which takes a while to complete prevTime = performance.now(); } ready = true; } const intervalWorker = new Worker('ticker.js'); intervalWorker.onmessage = function() { ready && sometimesLongTask(); };¿Causaría esto una pérdida de memoria?
Creo que no, pero no estoy seguro. Mi lógica es que, si bien a sometimesLongTask LongTask a veces toma un tiempo (cuando han pasado 30 milisegundos), el 99% del tiempo se ejecutará de inmediato. Como tal, a pesar de que se agrega una nueva tick a la cola de eventos de Javascript cada milisegundo, de vez en cuando Javascript puede acelerarlos y eliminarlos, ya que la mayoría de ellos no necesitarán ejecutarse. ¿Es este realmente el caso?
Además, ¿necesito el indicador de listo aquí, o no hace nada (y puedo deshacerme de él)? Creo que podría no estar haciendo nada porque Javascript tiene un solo subproceso, por lo que, aunque WebWorker puede publicar varios mensajes muy rápidamente, Javascript no puede ejecutar varias instancias de sometimesLongTask al mismo tiempo. ¿Correcto?
Sí, esto no provocará una fuga de memoria , ya que eso, por definición, significa que las asignaciones de memoria no se liberan a pesar de que ya no se necesitan . Sin embargo, los eventos en la cola de mensajes aún son necesarios, eventualmente serán recibidos por el trabajador.
Pero ni siquiera obtendrá un uso creciente de la memoria. Sin embargo, esto se debe únicamente a la comparación de prevTime : podemos suponer que todos los eventos en cola se pueden manejar (sin hacer nada) en los 30 ms entre las ejecuciones de la tarea larga.
¿Necesito la bandera de
readyaquí, o no hace nada?
De hecho, no hace nada útil. Tenga en cuenta que siempre es true cuando se ejecuta el controlador onmessage . El controlador onmessage nunca interrumpirá su sometimesLongTask síncrono durante el cual se establece en false .