2013-06-17 1 views
5

È possibile scrivere un semplice web worker dedicato in modo che elabori qualcosa continuamente e invii il suo stato solo quando il cliente lo richiede.Javascript web worker dedicato per inviare messaggi a richiesta

Quello che ho fatto finora, il file del client:

<script> 
    // spawn a worker 
    var worker = new Worker('basic-worker.js'); 
    // decide what to do when the worker sends us a message 
    worker.onmessage = function(e){ 
     document.getElementById('result').textContent = e.data; 
    }; 
</script> 
<html> 
<head></head> 
<body> 
    <p>The Highest prime number discovered so far : <outpout id="result"></output></p> 
</body> 
</html> 

Il file operaio:

var n = 0; 
search: while (true) { 
    n += 1; 
    for (var i = 2; i <= Math.sqrt(n); i += 1) 
     if (n % i == 0) 
     continue search; 
    // found a prime ! 
    postMessage(n); 
} 

Come si può vedere il lavoratore inviare continuamente i numeri primi si fonda. Mi piacerebbe essere in grado di lanciare il primo calcolo e chiedere al lavoratore di inviare l'ultimo primo che ha trovato quando faccio clic su un pulsante sul client, ad esempio. Sarebbe qualcosa di simile (lo so che non può funzionare come ma per dare un'idea generale di ciò che voglio):

di file Worker: file di

var n = 0; 
var lPrime = 0; 
// post last prime number when receiving a message 
onmessage = function(e) { 
    postMessage(lPrime); 
} 
// continously search for prime numbers 
search: while (true) { 
    n += 1; 
    for (var i = 2; i <= Math.sqrt(n); i += 1) 
     if (n % i == 0) 
     continue search; 
    // found a prime ! 
    //postMessage(n); 
    lPrime = n; 
} 

Cliente:

<script> 
    // spawn a worker 
    var worker = new Worker('basic-worker.js'); 
    // what to do when the worker sends us a message 
    worker.onmessage = function(e){ 
     document.getElementById('result').textContent = e.data; 
    }; 
    // post to the worker so the worker sends us the latest prime found 
    function askPrime(){ 
     worker.postMessage(); 
    }; 
</script> 
<html> 
<head></head> 
<body> 
    <p>The Highest prime number discovered so far : <outpout id="result"></output></p> 
    <input type="button" onclick="askPrime();"> 
</body> 
</html> 

risposta

8

Questo è non è un buon modello. Lavoratori sono thread singolo, così in qualsiasi momento, si può:

  1. eseguire un calcolo,

  2. inviare un evento, o

  3. rispondere a un evento.

Mentre il tuo operatore sta calcolando, non può rispondere agli eventi. Quando si invia una richiesta per l'ultimo primo, è necessario attendere che l'operatore completi ciò che sta facendo prima che possa elaborare la richiesta. Ovviamente, è possibile utilizzare setTimeout (o altri metodi) per consentire al browser di "interrompere" il lavoro corrente (vedere Javascript - how to avoid blocking the browser while doing heavy work?), ma l'intero punto dei lavoratori è quello di evitare all'utente di ricorrere a tale complessità inutile.

Uno schema migliore sarebbe una variabile non di lavoro che contiene l'ultimo massimo e viene aggiornato dal lavoratore ogni volta che trova un nuovo numero primo. È possibile interrogare tale variabile ogni volta che è necessario l'ultimo primario, e non è mai necessario attendere che il lavoratore elabori la richiesta.

// spawn a worker 
var worker = new Worker('basic-worker.js'); 

// store the latest prime as it is produced 
var latestPrime = 1; 
worker.onmessage = function(e){ 
    latestPrime = e.data; 
}; 

// fetch the latest prime from the variable 
function askPrime(){ 
    document.getElementById('result').textContent = latestPrime; 
}; 

Si potrebbe anche ottenere questo modello avendo due lavoratori:

  1. Lo script principale genera un operaio che tiene l'ultimo primo noto.

  2. Questo lavoratore genera un secondo lavoratore che esegue effettivamente il lavoro e segnala nuovi primi al primo operatore non appena vengono scoperti.

In questo modo, il primo operaio non fa alcun lavoro, ed è sempre libero di rispondere con l'ultima serata, e il secondo operaio non ha la necessità di fermare i suoi calcoli per rispondere alle richieste.

+0

Hai ragione, stavo cercando di risolvere questo sottosopra!Mi hai mostrato la strada giusta, grazie mille! –