2011-12-29 8 views
17

Estoy pensando en utilizar Web Workers para proporcionar algunas funciones en segundo plano mientras un usuario está navegando en mi sitio web (para eso están los Web Workers, ¿no?). Sin embargo, no quiero arriesgarme a comprometer la experiencia del usuario al causar desplazamientos laggy, controles que no responden, etc. Los Web Workers se asignan a los hilos del SO, por lo tanto, esperaría cierto control sobre la prioridad de estos hilos, sin embargo, como sé, no existe tal cosa en la API actual. ¿Sabes cómo lograr esto? Incluso con un truco?¿Hay alguna manera de establecer un Trabajador web como de baja prioridad?

+2

¿En qué plataforma y lenguaje? – rene

+0

¿Para qué tipo de tarea pretendes utilizar a los trabajadores de la web? Actividad periódica? ¿Una sola ejecución de una tarea? – Tudor

+0

@Tudor Diría ejecución por única vez (por ejemplo, el usuario carga una fotografía y el trabajador aplica un filtro similar a Photoshop, que consume bastante CPU, luego el trabajador alerta el hilo principal). – tunnuz

Respuesta

11

Bueno, no hay una llamada API para controlar detalles de bajo nivel como este. Sin embargo, creo que primero debe implementar lo que desea hacer y luego probar si el rendimiento alcanzado es demasiado grande en la experiencia del usuario. Supongo que, dado que no agregaron un control preciso sobre cómo se ejecutan los subprocesos, es probable que estén bien gestionados por la implementación subyacente.

9

¿Incluso con un truco? [...] el usuario sube una fotografía y el trabajador aplica un Photoshop-como filtro a la misma, lo cual es bastante intensivo de la CPU, entonces el trabajador avisa el hilo principal

Aquí hay un truco.

Reduzca la velocidad de su código. Algo como esto es lo que estoy utilizando actualmente para una simulación de partículas:

var TIME_STEP = 10, 
    paused = false, 
    state; // set by commands.start() 

function main_loop() { 
    if (paused) { 
     return; 
    } 

    // update state incrementally. Break your process into chunks 
    // for example pixels or rows of pixels 
    state = ____________; 

    // send state or progress to main thread 
    if (finished) { 
     self.postMessage(state); 
    } else { 
     self.postMessage(progress); 
    } 

    setTimeout(main_loop, TIME_STEP); 
} 

var commands = { 
    //...functions that can be called from main thread (pause/start/cancel/etc)... 
}; 

function message_handler (event) { 
    var data = event.data; 
    var command = commands[data.command]; 

    command.apply(this, data.args); 
} 

self.addEventListener('message', message_handler, false); 

TIME_STEP es el tiempo entre los cálculos y tendrá que ser diferente dependiendo de lo que está haciendo y cuánto tiempo puede permitirse el lujo de aumentar es el momento. Una cosa buena de hacerlo de esta manera es que puede aceptar pausas y cancelar solicitudes entre iteraciones.

Cuestiones relacionadas