2016-07-22 16 views
6

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

मेरा कोड यहां है;

मुख्य जावास्क्रिप्ट फ़ाइल:

$(document).ready(function() { 
    var worker = new Worker("js/TestWorker.js"); 
    worker.addEventListener('message', function (event) { 
     console.log(event.data); 
    }); 

    worker.addEventListener('error', function (event) { 
     console.log(event); 
    }); 
}); 

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

(function() { 
    var updateCounter = 0; 

    var updater = function() { 
     updateCounter += 1; 
     console.log("Update counter: " + updateCounter); 

     postMessage("test"); 
     setTimeout(updater, 10000); 
    }; 

    updater(); 
})(); 

के रूप में कहा गया है, कार्यकर्ता बस कुछ ही सेकंड, 10-20seconds या तो के बाद से कार्य बंद हो जाता है।

लेकिन अगर मैं कोड का यह टुकड़ा अपनी मुख्य जावास्क्रिप्ट-फ़ाइल में जोड़ता हूं;

var check = function() { 
    var localWorker = worker; 
    // setTimeout(check, 1000); 
}; 

// setTimeout(check, 1000); 

कार्यकर्ता इरादे के अनुसार काम करता है। सेटटाइम-कॉल की आवश्यकता नहीं है, इसलिए उन्हें टिप्पणी क्यों की जाती है। (ध्यान दें कि मैं सिर्फ अच्छी तरह से worker.length या कुछ इसी तरह के साथ काम की जगह ले सकता और यह अभी भी ठीक से काम करेगा।

कोई इस व्यवहार की व्याख्या कर सकते हैं? कार्यकर्ता समाप्त हो रही है और (ग़लती से) द्वारा कचरा-एकत्र ब्राउज़र या कुछ और यहाँ क्या हो रहा है कि मैं याद कर रहा हूँ

नोट करने के लिए

वर्थ कि अपने ब्राउज़र (क्रोम) कंसोल के लिए किसी भी त्रुटि या चेतावनी outputing नहीं है या तो है

संपादित करें:। एक ही व्यवहार देखा जाता है कि कोड को किसी अज्ञात फ़ंक्शन के अंदर निष्पादित किया गया है या नहीं।

EDIT2: यदि मैं वैश्विक दायरे में कार्यकर्ता चर रखता हूं तो इसे समय-समय पर समाप्त नहीं किया जाता है। इसके लिए क्या कारण हो सकता है?

+0

बहुत उत्सुक। मैं इस धारणा के तहत था कि वेब श्रमिक डोम नोड्स के समान हैं कि उन्हें केवल स्पष्ट रूप से मार दिया जा सकता है (यानी उन्हें एकत्रित नहीं किया जाना चाहिए, खासतौर से जब आप कुछ श्रोताओं को जोड़ चुके हैं)। क्या आपने फ़ायरफ़ॉक्स, आदि में एक ही कोड की कोशिश की है? यह मुझे एक बग की तरह लगता है। – Dave

+0

@ डेव हाँ, अभी फ़ायरफ़ॉक्स में परीक्षण किया गया है, जैसा कि इसे करना चाहिए। – jimka

उत्तर

2

कुछ शोध से पता चलता है कि जब वेब श्रमिकों के रूप में आप उम्मीद कर कार्य करने के लिए (यानी प्रत्यक्ष रूप से कचरा एकत्र नहीं किया जाएगा) अपेक्षा की जाती है, वहाँ Chrome में कुछ ज्ञात समस्या जो मतलब है कि आप उस व्यवहार पर भरोसा नहीं कर सकते हैं। https://bugs.chromium.org/p/chromium/issues/detail?id=572225 जो बारी में एक और अधिक अंतर्निहित बग का संदर्भ:

विशेष रुचि के

यह बहुत ही समान बग होगा कचरा श्रमिकों जो संभवतः किसी भी भविष्य की गतिविधियों प्रदर्शन नहीं कर सकते एकत्रित करने के की वजह से https://bugs.chromium.org/p/chromium/issues/detail?id=572226

यह प्रतीत हो रहा है (में इस मामले में कचरा संग्रह ज्ञात नहीं होगा, जैसा कि यह माना जाता है), लेकिन इस राज्य का पता लगाने के लिए तर्क में एक दोष का अर्थ है कि किसी लंबित गतिविधियां जो किसी आने वाले संदेश का जवाब देने से संबंधित नहीं हैं, उन्हें अनदेखा कर दिया जाएगा।

मूल रूप से

है, जबकि आप ग्रहण करने के लिए वेब कार्यकर्ता, (अब के लिए) डोम नोड्स जो केवल स्पष्ट रूप से हटाया जा सकता है की तरह व्यवहार व्यवहार में क्या आप वाकई हमेशा कार्यकर्ता से सुलभ के लिए एक संदर्भ रखना बनाने की जरूरत है सक्षम होना चाहिए कहीं, अन्यथा जब कचरा कलेक्टर इसमें शामिल होता है तो वह कार्यकर्ता को मार सकता है। यह केवल तभी जरूरी है जब आप सेटटाइमआउट का उपयोग कर रहे हों या कार्यकर्ता में समान हों; अगर यह सिर्फ संदेशों का जवाब देता है, तो आपको कोई समस्या नहीं होगी।

+0

आह , मैं देखता हूँ, दिलचस्प! – jimka

0
(function() { 
... 
})(); 

यह एक अज्ञात फ़ंक्शन है जिसे परिभाषा के बाद एक बार बुलाया जाएगा और उसके बाद ब्राउज़र इसे फेंक देगा। आपके वेब कार्यकर्ता को यह उस दायरे को परिभाषित किया गया है और यही कारण है कि यह केवल थोड़े समय के लिए काम कर रहा है।

+0

नहीं, यह नहीं हो सकता है। अगर वैश्विक दायरे में कोड निष्पादित किया जाता है तो मुझे वही व्यवहार मिलता है। – jimka

2

हो सकता है कि कार्यकर्ता वर वैश्विक होना चाहिए

var worker; 

$(document).ready(function() { 
    worker = new Worker("js/TestWorker.js");  
    worker.addEventListener('message', function (event) { 
      console.log(event.data); 
    }); 

    worker.addEventListener('error', function (event) { 
     console.log(event); 
    }); 
}); 
+0

हाँ, ऐसा कुछ प्रतीत होता है। कार्यकर्ता तब भी बना रहता है जब मैं वैरिएबल को वैश्विक दायरे में रखता हूं। कोई विचार यह क्यों है? – jimka

+0

मुझे लगता है कि कार्यकर्ता चर किसी भी अन्य चर की तरह कचरा इकट्ठा होते हैं और जब अनाम कार्य समाप्त होता है तो सभी स्थानीय चर कचरे एकत्र होते हैं। –

+0

हम्म, नहीं, मुझे ऐसा नहीं लगता है। अगर ऐसा होता तो मुझे कई मौकों पर इस समस्या का सामना करना पड़ता था, वेरिएबल्स गायब हो जाते थे और उनके मूल्यों को खो देते थे। – jimka

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