Sto pensando di utilizzare Web Worker per fornire alcune funzionalità in background mentre un utente sta navigando nel mio sito Web (questo è ciò che i Web Workers sono per, giusto?). Tuttavia, non voglio correre il rischio di compromettere l'esperienza dell'utente causando scorrimento lenta, controlli non responsivi, ecc. I Web worker sono mappati su thread del sistema operativo, quindi mi aspetterei un certo controllo sulla priorità di questi thread, tuttavia, fino a qui come so, non c'è nulla di simile nell'API corrente. Sai come ottenere questo? Anche con un hack?C'è un modo per impostare un web worker a bassa priorità?
risposta
Bene, non c'è alcuna chiamata API per controllare dettagli di basso livello come questo. Tuttavia, penso che dovresti prima implementare ciò che vuoi fare e poi testare se il successo della performance è troppo grande nell'esperienza utente. Presumo che dal momento che non hanno aggiunto un controllo preciso su come vengono eseguiti i thread, sono probabilmente ben gestiti dall'implementazione sottostante.
Anche con un hack? [...] l'utente carica una fotografia e il lavoratore si applica un filtro di Photoshop simile ad esso, che è abbastanza impegnativo per la CPU, quindi il lavoratore avvisa il thread principale
Ecco un hack.
Rallentare il codice. Qualcosa di simile è quello che sto attualmente in uso per una simulazione di particelle:
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
è il tempo che intercorre tra calcoli e dovrà essere diverso a seconda che cosa state facendo e per quanto tempo si può permettere di aumentare è il momento. Una cosa buona di farlo in questo modo è che puoi accettare la pausa e annullare le richieste tra le iterazioni.
Su quale piattaforma e lingua? – rene
Per che tipo di attività intendete utilizzare i web worker? Attività periodica? Esecuzione una tantum di un'attività? – Tudor
@Tudor Direi un'esecuzione una tantum (ad esempio, l'utente carica una foto e il lavoratore applica un filtro simile a Photoshop, che è piuttosto impegnativo per la CPU, quindi l'operatore avvisa il thread principale). – tunnuz