2013-06-17 20 views
5

क्या एक सरल समर्पित वेब कार्यकर्ता लिखना संभव है, इसलिए यह लगातार कुछ संसाधित करता है और ग्राहक द्वारा पूछे जाने पर ही अपना राज्य भेजता है।जावास्क्रिप्ट समर्पित वेब कार्यकर्ता मांग पर संदेश भेजने के लिए

मैं अब तक क्या किया है, क्लाइंट फ़ाइल:

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

कार्यकर्ता फ़ाइल:

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

आप कार्यकर्ता देख सकते हैं लगातार अभाज्य यह founds भेजें। मैं प्राइम गणना लॉन्च करने में सक्षम होना चाहता हूं और जब मैं क्लाइंट पर बटन पर क्लिक करता हूं तो उसे नवीनतम प्रधान भेजने के लिए कार्यकर्ता से पूछता है। ऐसा ही कुछ होगा (मैं जानता हूँ कि यह रूप में, लेकिन काम नहीं कर सकता मैं क्या चाहते हैं की एक सामान्य विचार देने के लिए):

कार्यकर्ता फ़ाइल:

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

क्लाइंट फ़ाइल:

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

उत्तर

8

यह वह जगह है एक अच्छा पैटर्न नहीं है। श्रमिक, एकल पिरोया हैं किसी भी क्षण में ऐसा है, तो वे या तो:

    1. एक परिकलन, एक घटना भेज सकते हैं या एक घटना के लिए

    2. जवाब।

    जबकि आपका कर्मचारी गणना कर रहा है, यह घटनाओं का जवाब नहीं दे सकता है। जब आप नवीनतम प्राइम के लिए अनुरोध भेजते हैं, तो आपको अपने अनुरोध को संसाधित करने से पहले कार्यकर्ता को यह पूरा करना होगा कि वह क्या कर रहा है। बेशक, आप वर्तमान कार्य को "बाधित" करने के लिए ब्राउज़र को अनुमति देने के लिए setTimeout (या अन्य विधियों) का उपयोग कर सकते हैं (Javascript - how to avoid blocking the browser while doing heavy work? देखें), लेकिन श्रमिकों के संपूर्ण बिंदु कर्मचारियों को ऐसी अनावश्यक जटिलता का सहारा लेने से बचाने के लिए है।

    एक बेहतर पैटर्न एक गैर-कार्यकर्ता चर होगा जो नवीनतम प्राइम रखता है, और जब भी इसे एक नया प्राइम मिलता है तो कार्यकर्ता द्वारा अद्यतन किया जाता है। जब भी आपको नवीनतम प्राइम की आवश्यकता होती है, तो आप उस चर से पूछ सकते हैं, और आपको कार्यकर्ता को आपके अनुरोध को संसाधित करने की प्रतीक्षा करने की आवश्यकता नहीं है।

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

    तुम भी दो कार्यकर्ताओं होने से इस पैटर्न को पूरा कर सकते:

    1. मुख्य स्क्रिप्ट एक कार्यकर्ता कि नवीनतम जाना जाता प्रधानमंत्री रखती spawns।

    2. वह कार्यकर्ता दूसरे कार्यकर्ता को जन्म देता है जो वास्तव में काम करता है और पहले कार्यकर्ता को नए प्राइम की रिपोर्ट करता है जैसा कि उन्हें पता चला है।

    इस तरह से, पहले कार्यकर्ता कोई काम नहीं करता है और हमेशा नवीनतम प्रधानमंत्री के साथ जवाब के लिए स्वतंत्र है, और दूसरा कार्यकर्ता कभी नहीं अनुरोध का जवाब देना इसकी संगणना को रोकने के लिए की जरूरत है।

  • +0

    आप सही हैं मैं इस उल्टा को हल करने की कोशिश कर रहा था!तुमने मुझे सही रास्ता दिखाया बहुत धन्यवाद! –

    संबंधित मुद्दे