2010-07-05 14 views
8

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

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

स्पष्ट विकल्प टाइमर का उपयोग करना है (सेट इंटरवल के साथ कहें) हालांकि मैंने पढ़ा है कि फ़िरिंग्स के बीच न्यूनतम देरी काफी लंबी है (http://ajaxian.com/archives/settimeout-delay) जो दुर्भाग्यपूर्ण है क्योंकि यह बहुत कम प्रोसेसिंग धीमा कर देगी।

क्या इस पर अन्य लोगों के विचारों को कर रहे हैं? मैं अपने आप से प्राप्त प्रत्येक onmessage के अंत में खुद को कार्यकर्ता प्रेषण onmessage है कोशिश करने के लिए जा रहा हूँ, इस प्रकार प्रभावी ढंग घटना प्रति प्रसंस्करण पाश की एक कदम को लागू करने, लेकिन सिर्फ देखने के लिए अगर किसी को भी इस बारे में किसी भी विचार किया था चाहता था।

धन्यवाद,

+0

Hooking https://stackoverflow.com/a/32269593/632951 – Pacerier

उत्तर

6

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

--Nick

+1

मुझे लगता है कि यदि गणना बंद कर दिया जाना चाहिए और फिर से शुरू इस काम नहीं करेगा। मुझे अभी तक इसका समाधान नहीं मिला है। उदाहरण: http: //gist.github।कॉम/607058 – Giacomo

+0

@ एनसीग्रा, यह उत्तर काम नहीं करता है: आपने बस एक कदम ऊपर की ओर समस्या को धक्का दिया था। तो क्या होगा यदि आप उप श्रमिकों को जन्म देते हैं? अब, वे सबवर्कर्स गणना करने में व्यस्त हैं और आप उन्हें अपने मुख्य कार्यकर्ता से बाधित नहीं कर सकते हैं। मुझे लगता है [पुराना अंतराल समाधान] (https://stackoverflow.com/a/10180450/632951) (अब वेबवर्कर के भीतर ही) एकमात्र तरीका है यदि हमें कार्यकर्ता को बाधित करने की आवश्यकता है, तो वेबवर्कर्स को वास्तविक अंतराल तंत्र की गंभीरता की आवश्यकता होती है जावा कर सकता है – Pacerier

0

एक ही समस्या मैं खोजा वेब श्रमिकों मसौदा तैयार करने और 9 से 12 के लिए जहां तक ​​मैं समझ गया है, Processing model खंड में कुछ पाया चरणों के बाद, एक कार्यकर्ता है कि एक कार्य होगा प्रसंस्करण शुरू होता है पहले पूरा होने तक किसी अन्य को संसाधित न करें। इसलिए, यदि आप किसी कार्य को रोकने और फिर से शुरू करने की परवाह नहीं करते हैं, तो nciagra के उत्तर को कार्य के प्रत्येक पुनरावृत्ति को पुन: निर्धारित करने से बेहतर प्रदर्शन करना चाहिए।

फिर भी जांच कर रही है, हालांकि।

+0

nciagra का जवाब काम नहीं करता है। – Pacerier

3

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

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

Spawning subworkers वैसे भी मुद्दों का एक ही सेट करने के लिए नेतृत्व करेंगे; आपको कुछ तर्कों के अनुसार अभी भी उप-कार्यकर्ताओं को समाप्त करना होगा (या नए बनाएं), और मुझे यकीन नहीं है कि यह भी समर्थित है (उदाहरण के लिए क्रोम पर)।

जेम्स

+1

एक ही समस्या है, और एक ही समाधान का उपयोग किया। वेबवर्कर द्वारा की गई गणनाओं को खोना नहीं है, मैं कुछ अंतराल पर अभिभावक "खिड़की" पर गणना डेटा पोस्ट कर रहा हूं, और फिर वेबवर्कर को श्वसन करते समय मैं परिणाम के साथ शुरू करता हूं – Picard

+0

दुर्भाग्य से, worker.terminate() स्मृति को रिसाव करता है। .. अगर यह sporadically इस्तेमाल किया जाता है तो यह काम कर सकता है, लेकिन मेरे विशिष्ट मामले में यह ब्राउज़र को बहुत जल्दी लटकता है https://bugs.chromium.org/p/chromium/issues/detail?id=502298 – solendil

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