2013-06-17 20 views
5

Czy możliwe jest napisanie prostego dedykowanego pracownika WWW, aby przetwarzał coś w sposób ciągły i wysyłał swój stan tylko wtedy, gdy klient go prosi.Javascript dedykowany pracownik WWW do wysyłania wiadomości na żądanie

co robiłem do tej pory, plik klient:

<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> 

Plik pracownik:

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); 
} 

Jak widać pracownika wysłać ciągły liczby pierwsze to zakłada. Chciałbym móc uruchomić obliczenia bazowe i poprosić pracownika, aby wysłał najnowszą liczbę podstawową, jaką znajdzie, gdy kliknę przycisk na kliencie, na przykład. To byłoby coś takiego (wiem, że to nie może pracować jako ale dać ogólne pojęcie o tym, co chcę):

plik Pracownik: file

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; 
} 

Klient:

<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> 

Odpowiedz

8

To jest nie jest to dobry wzór. Pracownicy są jednowątkowy, więc w każdej chwili, mogą albo:

  1. wykonać obliczenia,

  2. wysłać zdarzenie lub

  3. reagowania na zdarzenia.

Podczas obliczania pracownik nie może reagować na zdarzenia. Wysyłając żądanie najnowszego primera, należy poczekać, aż pracownik zakończy to, co robi, zanim będzie mógł przetworzyć żądanie. Oczywiście można użyć metody setTimeout (lub innych metod), aby przeglądarka "przerywała" bieżącą pracę (patrz Javascript - how to avoid blocking the browser while doing heavy work?), ale cały pracownik ma uchronić cię przed skorzystaniem z takiej niepotrzebnej złożoności.

Lepszym wzorem będzie zmienna nierobotnicza, która zawiera najnowszą liczbę pierwszą i jest aktualizowana przez pracownika, gdy tylko znajdzie nową liczbę pierwszą. Możesz zapytać o tę zmienną, gdy potrzebujesz najnowszego primera i nigdy nie musisz czekać, aż pracownik przetworzy żądanie.

// 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; 
}; 

Można także dokonać tego wzorca poprzez dwa pracowników:

  1. Głównym skrypt ikra pracownika, który przechowuje ostatnią znaną Prime.

  2. Ten pracownik spawnu drugiego pracownika, który faktycznie wykonuje pracę i zgłasza nowe liczby pierwsze do pierwszego pracownika, gdy zostaną odkryte.

ten sposób, pierwszy pracownik nie wykonywał żadnej pracy i jest zawsze odpowiedz z najnowszymi sile, a drugi pracownik nie musi zatrzymać jego obliczeń, aby odpowiedzieć na żądania.

+0

Masz rację, próbowałem rozwiązać to do góry nogami!Pokazałeś mi właściwą drogę, dziękuję! –

Powiązane problemy