2012-07-06 18 views
25

हम इस तरह एचटीएमएल 5 में वेब कार्यकर्ता का उपयोग कर सकते हैं:वेब वर्कर सीधे फ़ंक्शन क्यों नहीं कर सकता?

var worker = new Worker('worker.js'); 

लेकिन क्यों हम इस तरह एक समारोह फोन नहीं कर सकते हैं?

var worker = new Worker(function(){ 
    //do something 
}); 
+2

एक अन्य प्लगइन जो आपकी मदद कर सकती है [vkThread] (http://www.eslinstructor.net/vkthread/) है। [Http://www.eslinstructor.net/vkthread/](http://www.eslinstructor.net/vkthread/) पर एक नज़र डालें, आपको वहां उदाहरण और दस्तावेज़ीकरण मिलेगा। – vadimk

+0

आपको एक यूआरएल का उपयोग करने की जरूरत है लेकिन कुछ ब्राउज़र आपको एक बीएलओबी यूआरएल का उपयोग करने की अनुमति देंगे। एक उदाहरण के लिए [यह] (http://stackoverflow.com/a/6454685/19676) उत्तर देखें। – Maurice

+0

जैसा कि @Qix ने एक और reponses टिप्पणियों में कहा, vkThread भी function.toString पर आधारित है, जो ब्राउज़र के बीच असंगतता लाता है। –

उत्तर

17

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

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

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

+0

सहमत हुए, हम कुछ समय दूर हैं लेकिन साथ में आए हैं। –

+0

मुझे लगता है कि जावास्क्रिप्ट सिंगल-थ्रेडेड है। लेकिन ब्रोसर मल्टी-थ्रेडेड वाले पेज खोल और चला सकता है। तो मुझे लगता है कि वेब कार्यकर्ता एक नया पृष्ठ बनाते हैं (या इसे एक नया वातावरण कहते हैं) और इसमें स्क्रिप्ट चलाते हैं? तो वेब कर्मचारी सिर्फ बाहरी जेएस फ़ाइल को कॉल कर सकता है। – Dozer

+0

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

0

डिज़ाइन वेब श्रमिकों द्वारा बहु-थ्रेडेड हैं, जावास्क्रिप्ट एकल थ्रेड किया गया है " *" एकाधिक स्क्रिप्ट एक ही समय में नहीं चल सकते हैं।

उल्लेख करने के लिए: http://www.html5rocks.com/en/tutorials/workers/basics/

+0

imline श्रमिकों पर संप्रदाय देखें! यह सबसे निकटतम आपको मिलेगा। – starbeamrainbowlabs

8

यह सवाल before कहा गया है, लेकिन किसी कारण से, ओ पी हटाने का निर्णय लिया।
यदि कोई फ़ंक्शन से वेब कार्यकर्ता बनाने के लिए किसी विधि की आवश्यकता है, तो मैं अपना उत्तर दोबारा पोस्ट करता हूं।


this post में, तीन तरीके एक मनमाना स्ट्रिंग से एक वेब कार्यकर्ता बनाने के लिए दिखाया गया है। इस जवाब में, मैं तीसरी विधि का उपयोग कर रहा हूं, क्योंकि यह सभी वातावरण में समर्थित है।

एक सहायक फ़ाइल की जरूरत है:

// Create a Web Worker from a function, which fully runs in the scope of a new 
// Worker 
function spawnWorker(func) { 
    // Stringify the code. Example: (function(){/*logic*/}).call(self); 
    var code = '(' + func + ').call(self);'; 
    var worker = new Worker('Worker-helper.js'); 
    // Initialise worker 
    worker.postMessage(code); 
    return worker; 
} 

var worker = spawnWorker(function() { 
    // This function runs in the context of a separate Worker 
    self.onmessage = function(e) { 
     // Example: Throw any messages back 
     self.postMessage(e.data); 
    }; 
    // etc.. 
}); 
worker.onmessage = function() { 
    // logic ... 
}; 
worker.postMessage('Example'); 

ध्यान दें कि स्कोप सख्ती से अलग होती है:

// Worker-helper.js 
self.onmessage = function(e) { 
    self.onmessage = null; // Clean-up 
    eval(e.data); 
}; 

अपने वास्तविक कार्यकर्ता में, इस प्रकार इस सहायक फ़ाइल प्रयोग किया जाता है। चर केवल worker.postMessage और worker.onmessage का उपयोग करके पारित किया जा सकता है। सभी संदेश structured clones हैं।

+0

यह मानता है कि 'Function.toString()' एक अन-eval decompiler के रूप में काम करता है, जो कुछ वातावरण में मामला नहीं है। सावधानी से प्रयोग करें! – Qix

+0

@Qix आपकी टिप्पणी अधिक उपयोगी होगी यदि आप कम से कम एक सामान्य ब्राउज़र नाम दे सकते हैं जहां वेब वर्कर समर्थित हैं, लेकिन उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन पर 'toString()' डिफ़ॉल्ट रूप से कार्यात्मक रूप से समकक्ष स्रोत नहीं लौटाता है। –

+0

ब्राउज़र केवल जावास्क्रिप्ट वातावरण नहीं हैं। इस तथ्य का तथ्य यह है कि यह डब्ल्यू 3 सी मानक के साथ-साथ एक्स्मिथस्क्रिप्ट मानकों के लिए है (कार्यों को कम नहीं किया जाना चाहिए; पर्यावरण जो इसे समर्थन देते हैं, इसे केवल डीबगिंग उद्देश्यों के लिए एक अतिरिक्त सुविधा के रूप में प्रदान करते हैं)। – Qix

3

यह उत्तर थोड़ा देर हो सकता है, लेकिन मैंने वेब श्रमिकों के उपयोग को सरल बनाने के लिए एक पुस्तकालय लिखा और यह ओपी की आवश्यकता के अनुरूप हो सकता है।इसे देखें: https://github.com/derekchiang/simple-worker

यह आप की तरह कुछ करने के लिए अनुमति देता है: बस https://github.com/zevero/worker-create

मेरे छोटे प्लगइन का उपयोग

SimpleWorker.run({ 
    func: intensiveFunction, 
    args: [123456], 
    success: function(res) { 
    // do whatever you want 
    }, 
    error: function(err) { 
    // do whatever you want 
    } 
}) 
+0

यह उपरोक्त @ vadimk की vkTread पोस्ट के समान दिखता है - स्पष्ट रूप से विभिन्न परियोजनाएं, हालांकि मैं कह सकता हूं कि vkThread अच्छी तरह से काम करता है और उपयोग के लिए कई अलग-अलग विधियां हैं। – Nick

0

और

var worker_url = Worker.create(function(e){ 
    self.postMessage('Example post from Worker'); //your code here 
}); 
var worker = new Worker(worker_url); 
1

करते हैं यह इष्टतम नहीं है और यह हो गया है टिप्पणियों में उल्लिखित, यदि आपका ब्राउज़र वेब श्रमिकों के लिए blobURLs का समर्थन करता है तो बाहरी फ़ाइल की आवश्यकता नहीं होती है। HTML5Rocks मेरी कोड के लिए inspiration था:

function sample(e) 
{ 
    postMessage(sample_dependency()); 
} 

function sample_dependency() 
{ 
    return "BlobURLs rock!"; 
} 

var blob = new Blob(["onmessage = " + sample + "\n" + sample_dependency]); 
var blobURL = window.URL.createObjectURL(blob); 
var worker = new Worker(blobURL); 

worker.onmessage = function(e) 
{ 
    console.log(e.data); 
}; 

worker.postMessage(""); 

चेतावनियां:

  • ब्लॉब श्रमिकों को सफलतापूर्वक सापेक्ष URL का उपयोग नहीं होगा। HTML5Rocks लिंक इसमें शामिल है लेकिन यह मूल प्रश्न का हिस्सा नहीं था।

  • लोगों ने वेब श्रमिकों के साथ ब्लॉब यूआरएल का उपयोग करके समस्याओं की सूचना दी है। मैंने आईई 11 (जो भी एफसीयू के साथ भेजा गया है), एमएस एज 41.1629 9 (पतन निर्माता का अपडेट), फ़ायरफ़ॉक्स 57, और क्रोम 62 के साथ कोशिश की है। सफारी समर्थन के लिए कोई सुराग नहीं है। जिन लोगों ने मैंने परीक्षण किया है, उन्होंने काम किया है।

  • ध्यान दें कि "नमूना" और "sample_dependency" ब्लॉब निर्माता कॉल में संदर्भ परोक्ष sample.toString() और sample_dependency.toString() रूप Function.prototype.toString() फोन है, जो toString(sample) और toString(sample_dependency) बुला से बहुत अलग है।

इसे पोस्ट किया गया क्योंकि यह पहला स्टैक ओवरफ्लो है जो वेब वर्कर्स को अतिरिक्त फ़ाइल का अनुरोध किए बिना उपयोग करने के लिए खोजता है।

ज़ीवरो के उत्तर पर एक नज़र डालें और उसके रेपो में कोड समान दिखाई देता है। यदि आप एक साफ आवरण पसंद करते हैं, तो यह लगभग उसके कोड का क्या करता है।

आखिरकार - मैं यहाँ एक नोब हूं इसलिए किसी भी/सभी सुधारों की सराहना की जाती है।

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