2015-02-19 5 views
5

शीर्षक के अनुसार ...यदि मैं एक ही वेबवर्कर को एकाधिक संदेश भेजता हूं, तो क्या यह उन्हें कतारबद्ध करता है और अनुक्रमिक रूप से संसाधित करता है?

असल में, यदि मेरे पास एक एकल वेबवर्कर है और इसे एक बार में 1000 संदेश पोस्ट करें।

प्रत्येक संदेश परिणामस्वरूप प्रसंस्करण गहन ऑपरेशन कर रहा है।

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

यदि मैं ऐसा करता हूं तो मैं कार्यकर्ता के भीतर एक क्यूइंग प्रणाली को लागू करने से बेहतर हूं? या यह आवश्यक नहीं है?

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

मुझे उम्मीद है कि यह बनाता है।

उत्तर

3

कर्मचारी संदेश को कतारबद्ध करेगा (विशेष रूप से, यह onmessage पर कॉल कतारबद्ध करेगा) और जब भी कार्यकर्ता का कॉल स्टैक खाली होता है तो प्रत्येक संदेश को संसाधित करता है।

इसका मतलब है कि, हालांकि, किसी भी विशेष ऑपरेशन को पूरा करने से पहले एसिंक्रोनस ऑपरेशन इनपुट एकाधिक संदेश संसाधित हो सकता है। उदाहरण के लिए:

onmessage = function(e) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", "/" + e.data); 
    xhr.onload = function() { 
     postMessage(xhr.responseText); 
    } 
} 

आप एक बार से कम 1000 संदेशों में पारित कर दिया है, मैं ब्राउज़र 1000 अजाक्स अनुरोध (या अनुरोध के कम से कम एक बहुत) बंद आग से पहले ही onload के अंदर postMessage चलाता है संदेह है। ऐसा इसलिए है क्योंकि onload अजाक्स कॉल पूरा होने तक नहीं चलता है, और प्रत्येक onload कॉल onmessage पर लंबित कॉल के पीछे ईवेंट कतार में जोड़ा जाएगा, जिसे अजाक्स फ़ेच पूरा करने से पहले अनुरोध किया गया था।

आप यह सुनिश्चित करना है कि केवल एक Ajax अनुरोध एक समय में बाहर है चाहता था, तो आप वास्तव में एक आंतरिक कतार है कि केवल चले गए जब onload बुलाया गया था को लागू कर सकते हैं:

var queue = []; 
var busy = false; 

onmessage = function(e) { 
    if(busy) { 
     queue.push(e); 
    } 
    else { 
     busy = true; 
     runAjax(e); 
    } 
} 

var runAjax = function(e) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", e.data); 
    xhr.onload = function() { 
     postMessage(xhr.responseText); 
     if(queue.length) { 
      // run the next queued item 
      runAjax(queue.shift()); 
     } else { 
      busy = false; 
     } 
    } 
} 

इस मामले में, पहले संदेशों चला जाता है else ब्लॉक में, जो busy = true सेट करता है और अजाक्स फ़ेच चलाता है। निम्नलिखित 999 संदेशों को if ब्लॉक पर भेजा गया है, क्योंकि busytrue है (और false नहीं बन जाएगा जब तक कि अजाक्स अनुरोध पूरा नहीं हुआ औरqueue खाली है)। अजाक्स अनुरोध पूरा होने के बाद ही कतारबद्ध संदेश प्रबंधित किए जाते हैं।

आप समय में एक से अधिक Ajax अनुरोध को सहन करना चाहता था, तो आप एक काउंटर के बजाय बूलियन का इस्तेमाल कर सकते हैं: बजाय true और false, और परीक्षण की स्थापना के busy++ और busy-- का उपयोग करें कि बकाया कनेक्शन की वर्तमान संख्या तक नहीं पहुंची है आपकी अनुमति अधिकतम (यानी, if(busy == 5)if(busy) के बजाय)।

1

वेब वर्कर प्रत्येक संदेश को एक समय में प्राप्त करता है - किसी भी कतार को आपके तर्क से किया जाएगा - गति के लिए टाइप किए गए सरणी के रूप में डेटा को स्थानांतरित करने के लिए सबसे अच्छा है, विशेष रूप से ट्रांसफर करने योग्य ऑब्जेक्ट्स नामक एक फॉर्म - संभवतः आप कई (1000) इस तरह के टाइप किए गए सरणी (फ्लोट या इंट) में संदेश और इसे एक संदेश बनाते हैं - ब्राउज़र से वेब वर्कर या इसके विपरीत वास्तविक डेटा स्थानांतरण, तेजी से - मिलीसेकंड में कम से कम 10 के एमबीटी टाइप की गई सरणी है ... यह संदेश करता है कम स्तरीय टाइप किए गए सरणी की तुलना में स्पीड पेनल्टी के साथ-साथ ऑब्जेक्ट्स को संभालें

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

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