2011-12-29 25 views
17

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

+2

किस प्लेटफ़ॉर्म और भाषा पर? – rene

+0

वेब श्रमिकों का उपयोग करने का आप किस प्रकार का कार्य करना चाहते हैं? आवधिक गतिविधि? एक कार्य का एक बार निष्पादन? – Tudor

+0

@ ट्यूडर मैं एक बार निष्पादन कहूंगा (उदाहरण के लिए उपयोगकर्ता एक तस्वीर अपलोड करता है और कार्यकर्ता इसे फ़ोटोशॉप-जैसे फ़िल्टर पर लागू करता है, जो कि बहुत सीपीयू गहन है, तो कार्यकर्ता मुख्य धागा को अलर्ट करता है)। – tunnuz

उत्तर

11

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

9

यहां तक ​​कि हैक के साथ भी? [...] उपयोगकर्ता एक तस्वीर अपलोड करती है और कार्यकर्ता यह करने के लिए एक फ़ोटोशॉप की तरह फिल्टर, जो बहुत सीपीयू गहन है पर लागू होता है, तो कार्यकर्ता अलर्ट मुख्य थ्रेड

यहाँ एक हैक है।

अपना कोड धीमा करें।

var TIME_STEP = 10, 
    paused = false, 
    state; // set by commands.start() 

function main_loop() { 
    if (paused) { 
     return; 
    } 

    // update state incrementally. Break your process into chunks 
    // for example pixels or rows of pixels 
    state = ____________; 

    // send state or progress to main thread 
    if (finished) { 
     self.postMessage(state); 
    } else { 
     self.postMessage(progress); 
    } 

    setTimeout(main_loop, TIME_STEP); 
} 

var commands = { 
    //...functions that can be called from main thread (pause/start/cancel/etc)... 
}; 

function message_handler (event) { 
    var data = event.data; 
    var command = commands[data.command]; 

    command.apply(this, data.args); 
} 

self.addEventListener('message', message_handler, false); 

TIME_STEP गणना के बीच का समय है और निर्भर करता है कि आप क्या कर रहे हैं और कितनी देर तक आप इसे समय आ गया है बढ़ाने के लिए खर्च कर सकते हैं अलग होने की आवश्यकता होगी: कुछ इस तरह क्या मैं वर्तमान में एक कण अनुकरण के लिए उपयोग कर रहा हूँ है। ऐसा करने के बारे में एक अच्छी बात यह है कि आप विराम स्वीकार कर सकते हैं और पुनरावृत्तियों के बीच अनुरोध रद्द कर सकते हैं।

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