2011-12-01 14 views
9

मैं वेब श्रमिकों के साथ प्रयोग कर रहा हूं, और यह सोच रहा था कि वे कितनी अच्छी तरह से समानांतर समस्याओं से निपटेंगे। इसलिए मैंने Connaway's Game of Life लागू किया। (धुंध या कुछ करने से थोड़ा अधिक मज़ेदार होने के लिए।) इस मामले में समस्याएं समान होंगी।)कर्मचारी-से-कार्यकर्ता संचार कैसे करें?

इस समय मेरे पास एक वेब कार्यकर्ता पुनरावृत्ति कर रहा है और यूआई थ्रेड के लिए नई छविडेटा पोस्ट कर रहा है मेरे कैनवास में जगह है। अच्छी तरह से काम करता है।

मेरा प्रयोग वहां खत्म नहीं होता है, क्योंकि मेरे पास कई सीपीयू उपलब्ध हैं और मेरे आवेदन को समानांतर करना चाहते हैं।

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

जब आगे बंटवारे, प्रत्येक कार्यकर्ता केवल का यह श्रमिकों पड़ोसी है ट्रैक रखने के लिए है, और यूआई धागा केवल यूआई अद्यतन करने के लिए जिम्मेदार होगा (के रूप में यह होना चाहिए)।

मेरे समस्या यह है, मैं नहीं दिख रहा है कि कैसे मैं इस कार्यकर्ता करने वाली कार्यकर्ता संचार प्राप्त कर सकते हैं। मैं एक प्रारंभ postMessage के माध्यम से eachother करने के लिए पड़ोसियों सौंपने की कोशिश की, लेकिन वह मेरी कार्यकर्ता नकल के बजाय एक संदर्भ है, जो सौभाग्य से क्रोम असंभव होने के बारे में मुझे चेतावनी दी नीचे हाथ होगा।

Uncaught Error: DATA_CLONE_ERR: DOM Exception 25 

अंततः मुझे लगता है कि SharedWorker नामक कुछ है। क्या यह मुझे देखना चाहिए, या Worker का उपयोग करने का कोई तरीका है जो मेरी समस्या का समाधान करेगा?

उत्तर

5

आप channel messaging उपयोग करने के लिए सक्षम होना चाहिए:

var channel = new MessageChannel(); 
worker1.postMessage({code:"port"}, [channel.port1]); 
worker2.postMessage({code:"port"}, [channel.port2]); 
अपने कार्यकर्ता धागे में

तब:

var xWorkerPort; 
onmessage = function(event) { 
    if (event.data.code == "port") { 
     xWorkerPort = event.ports[0]; 
     xWorkerPort.onmessage = function(event) { /* do stuff */ }; 
    } 
} 

और भी बहुत कुछ प्रलेखन के आसपास नहीं है, लेकिन आप की कोशिश कर सकते this MS summary आरंभ करने के लिए।

+0

आपके उत्तर @robertc के लिए धन्यवाद, मैं इस बारे में पूरी तरह से भूल गया था। मुझे लगता है मुझे इस पर कुछ समय बिताना चाहिए। – Mithon

+0

कैसे संदेश चैनल कार्यकर्ता संचार –

+0

इस के लिए उपयोगी है जब तक इस बग भूमि फ़ायरफ़ॉक्स में काम नहीं करेगा: https://bugzilla.mozilla.org/show_bug.cgi?id=911972 – Adria

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