2016-07-03 9 views
18

जावास्क्रिप्ट बफर को स्रोत थ्रेड से वर्कर थ्रेड में स्थानांतरित करने की अनुमति देता है। अन्यथा, ऐरेबफर की प्रतिलिपि बनाई जाती है, फिर कार्यकर्ता को पास कर दिया जाता है। स्थानांतरित बफ़र्स स्रोत धागा [1] में सुलभ ("neutered") नहीं हैं:जावास्क्रिप्ट में स्थानांतरित बफर को क्यों स्थानांतरित किया जाता है?

// create data that can be transfered 
var arr = new Uint8Array(5); 

// outputs: 5 
console.log(arr.buffer.byteLength); 

var worker = new Worker("some_worker.js"); 

// transfer the buffer 
worker.postMessage({arr: arr}, [arr.buff]); 

// the buffer vanishes. is "Neutered" 
// outputs: 0 
console.log(arr.buffer.byteLength); 

मैं unterstand कैसे तंत्र काम करता है। हालांकि मैं उत्सुक हूं कि इसे क्यों पेश किया गया था। पारंपरिक थ्रेडिंग मॉडल की तरह वर्कर थ्रेड के बीच साझा डेटा क्यों नहीं है, जो एकाधिक थ्रेड को स्मृति क्षेत्र तक पहुंचने की अनुमति देता है?


स्पष्टीकरण के लिए एक ही प्रश्न के अन्य phrasings:

क्यों हस्तांतरण पर neutered बफर कर रहे हैं?/इस तंत्र के पीछे तर्क क्या है?/इसे क्यों पेश किया गया था? श्रमिकों के बीच स्मृति क्षेत्रों को क्यों साझा नहीं किया जा सकता है?

मैं विश्वसनीय और/या आधिकारिक स्रोतों से उत्तर खींचने की तलाश में हूं।


[1] https://developer.mozilla.org/en/docs/Web/API/Worker/postMessage

+1

धन्यवाद, मीकल चारेम्ज़ा। मैंने आपकी सजा को प्रश्न में जोड़ा क्योंकि यह सवाल का कारण था। –

उत्तर

12

हस्तांतरणीय वस्तुओं क्रम में वस्तुओं को कॉपी (विशेष रूप से जब हम बड़े आकार की वस्तुओं के बारे में बात कर रहे हैं) बनाम प्रदर्शन में सुधार करने वेब कर्मचारी में पेश किए गए। इसे सामान्य प्रोग्रामिंग भाषाओं (जैसे सी/सी ++) में पास-बाय-वैल्यू और पास-बाय-रेफरेंस के बीच तुलना के समानांतर किया जा सकता है।

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

सामान्य रूप से, वेब श्रमिकों को साझा-स्मृति मॉडल के रूप में डिज़ाइन नहीं किया गया था, लेकिन एक संदेश-विनिमय मॉडल के रूप में।

प्रदर्शन अंतर पर आगे पढ़ने के लिए, this देखें। आप this भी देख सकते हैं, जहां एक चर्चा है कि वेबकिट में वेब वर्कर्स के लिए साझा मेमोरी मॉडल क्यों नहीं अपनाया गया है।

+0

https://www.w3.org/TR/html5/infrastructure.html#transferable-objects – Knu

+1

+1 "सामान्य रूप से, वेब श्रमिकों को साझा-स्मृति मॉडल के रूप में डिज़ाइन नहीं किया गया था, लेकिन एक संदेश-विनिमय मॉडल के रूप में । " अंतिम लिंक से उद्धरण: "यह वेब श्रमिकों का एक प्राथमिक डिजाइन सिद्धांत है कि उचित बहुप्रचारित डिजाइन करने की जटिलताओं को जावास्क्रिप्ट डेवलपर्स के संपर्क में नहीं लाया जाएगा।" –

2

कारण प्रदर्शन है। भेजा गया डेटा कॉपी नहीं किया गया है, ArrayBuffer का स्वामित्व रिसीवर को स्थानांतरित कर दिया गया है।

साझा स्मृति के लिए, आप SharedArrayBuffer

7

का उपयोग करना चाहिए यह एक बहुत ही बुनियादी बहु सूत्रण सवाल है। यदि ऐरे मुख्य थ्रेड और कार्यकर्ता दोनों में पहुंच योग्य था, तो एक म्यूटेक्स लॉक लागू किया जाना चाहिए ताकि बफर तक पहुंचने पर दौड़ की स्थिति दिखाई न दे। साथ ही, मुझे लगता है कि जब आप प्रदर्शन चाहते हैं तो आमतौर पर ऐरे बफर का उपयोग किया जाता है, लेकिन उस बफर से डेटा पढ़ने/लिखने के लिए लॉक होने से कार्यकर्ता धीमा हो जाता है।

मुझे लगता है कि संसाधन "स्थानांतरित" और साझा नहीं होने के कारणों में से एक है।

टी एल; डॉ: बहु सूत्रण

3

WHATWG एमएल के लिए तदनुसार, चुनाव

आप कार्यकर्ताओं के बीच डेटा साझा नहीं कर सकते क्योंकि, thread safe होना था। जेएस निष्पादन के कई धागे के बीच कोई साझा स्थिति नहीं है (और वहां नहीं हो सकता है)।

(source)

इसके अलावा

,

हम करना चाहते हैं उन्हें एक कार्यकर्ता को पोस्ट करने या वापस मुख्य थ्रेड पर पर स्रोत ArrayBuffer, और किसी भी ArrayBufferViews, शून्य लम्बाई बनाते हैं। पिंग-पोंगिंग उसी ऐरेबफर को आगे और आगे आप से प्रत्येक बैटरिंग स्टोर को आवंटित करने से बच सकते हैं।

(source)

दुर्भाग्य से, मैं चश्मा के बारे में चर्चा नहीं पाते हैं, the page जहां यह होस्ट किया जाना चाहिए 404 देता है, मैं कहीं और

0

यह तेजी उसकी एक प्रति प्राप्त करने की कोशिश करेंगे ऐतिहासिक परिस्थितियों से प्रेरित होने के लिए, श्रमिकों को कम से कम परिवर्तन करने के इरादे से संदेश-पास API [1] के रूप में पेश किए जाने के बाद स्थानांतरण में जोड़ा गया था। [2] [3]।


[1] https://bugzilla.mozilla.org/show_bug.cgi?id=720083 (Firefox में लागू करने के लिए अनुरोध)

[2] https://mail.mozilla.org/pipermail/es-discuss/2014-May/037239.html

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

[3] https://mail.mozilla.org/pipermail/es-discuss/2014-May/037227.html

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

+0

यह कोई कारण नहीं है। साझा संसाधनों के साथ या तो वैश्विक दुभाषिया ताला की आवश्यकता होगी, जो श्रमिकों को पहली जगह रखने के उद्देश्य को हरा देगा, या सिंक्रनाइज़ेशन ऑब्जेक्ट्स होगा, जो जेएस में बल्कि विदेशी होगा। – transistor09

+0

@ ट्रांजिस्टर 0 9 क्या आप विस्तार कर सकते हैं कि यह एक कारण क्यों नहीं है? एक दूसरी, पूरी तरह से अलग प्रणाली को निर्दिष्ट करने और कार्यान्वित करने की बजाय मौजूदा सुविधा के लिए एक छोटा पैच पेश करना, मुझे बहुत समझ में आता है। –

+0

जो आप उद्धृत कर रहे हैं वह * कारण नहीं है; यह सबसे छोटा * परिणामस्वरूप परिवर्तन * है जो ऑब्जेक्ट्स साझा करने की इजाजत देता है, लेकिन एक समय में ** केवल एक ** संदर्भ (पहले से उल्लिखित कारणों के लिए) के स्वामित्व में है। – transistor09

0
इन अवधारणा जावास्क्रिप्ट में आप इन कोडिंग का उपयोग करना चाहिए का उपयोग कर के लिए

,

PostMesage(aMessage, transferList) 

transferList में आप हस्तांतरणीय वस्तुओं, जो aMessage में निहित उल्लेख करना होगा:

var objData = 
{ 
    str: "string", 
    ab: new ArrayBuffer(100), 
    i8: new Int8Array(200) 
}; 
objWorker.postMessage(objData, [objData.ab, objData.i8.buffer]); 

On other side: 

self.onmessage = function(objEvent) 
{ 
    var strText = objEvent.data.str; 
    var objTypedArray = objEvent.data.ab; 
    var objTypedArrayView = objEvent.data.i8; 
} 

"हस्तांतरणीय वस्तुओं का उपयोग करने के "आप वास्तव में ऑब्जेक्ट के स्वामित्व को वेब कार्यकर्ता से या उससे स्थानांतरित करते हैं। यह संदर्भ द्वारा गुजरने जैसा है जहां एक प्रति नहीं बनाई गई है। इसके बीच का अंतर और सामान्य पास-बाय-रेफरेंस यह है कि डेटा को स्थानांतरित करने वाला पक्ष अब इसे एक्सेस नहीं कर सकता है।

1

बस स्पष्ट स्थानान्तरण होने के लिए दोनों का उपयोग MessagePorts

[1] समर्पित कार्यकर्ताओं पर्दे के पीछे MessagePort वस्तुओं का उपयोग के रूप में दोनों समर्पित और साझा श्रमिकों के लिए लागू होता है।

[2] साझा कार्यकर्ताओं के साथ संचार स्पष्ट MessagePort साथ किया जाता है वस्तुओं

postMessage हस्तांतरण करने के लिए या फोन करने वाले की पसंद के आधार पर क्लोन निर्दिष्ट किया जाता है:

[3] port.postMessage (संदेश [, स्थानांतरण]) चैनल के माध्यम से एक संदेश पोस्ट करें। हस्तांतरण में सूचीबद्ध ऑब्जेक्ट्स को स्थानांतरित कर दिया गया है, न केवल क्लोन किया गया है, जिसका अर्थ है कि वे अब भेजने की तरफ उपयोग करने योग्य नहीं हैं।

हालांकि यह केवल इंगित करता है कि पोस्टर एक प्रतिलिपि रखता है, आमतौर पर दक्षता के आधार पर, और यदि कोई स्मृति साझा नहीं की जाती है।

यह "स्मृति" यह स्पष्ट रूप से निर्दिष्ट किया जाता है कि यह कार्यकर्ता प्रकार या मौसम डेटा पर ध्यान दिए बिना साझा नहीं किया जाना चाहिए स्थानांतरित होने पर या क्लोन बात आती है:

[4] जब कोई उपयोगकर्ता एजेंट है यूआरएल यूआरएल के साथ एक स्क्रिप्ट के लिए एक कार्यकर्ता को चलाने के लिए, एक वातावरण सेटिंग्स आपत्ति सेटिंग्स वस्तु, और एक यूआरएल रेफरर यह निम्न चरणों को चलाना चाहिए:

एक अलग बराबर बनाएं एलीएल निष्पादन पर्यावरण (यानी। एक अलग थ्रेड या प्रक्रिया या समकक्ष निर्माण), और उस संदर्भ में इन शेष चरणों को चलाएं।

तो अब सवाल: क्यों? क्यों उपयोगकर्ता एजेंट किसी भी और सभी प्रकार के श्रमिकों के लिए समानांतर निष्पादन वातावरण बना सकता है?

सुरक्षा? नहीं। क्षमता? (जब से जेएस कुशल है?), न तो।

कारण पूरे विनिर्देश का पालन करने या सम्मान करने में सक्षम होना है।आप link [4] का पालन करें, तो आप कम से कम दिखाई देंगे:

जब कोई उपयोगकर्ता एजेंट एक कार्यकर्ता यह कार्यकर्ता मुख्य लूप के साथ समानांतर में निम्न चरणों के चलाना चाहिए समाप्त करने के लिए है ("एक कार्यकर्ता को चलाने" प्रसंस्करण मॉडल को परिभाषित उपरोक्त):

1) कार्यकर्ता के वर्कर ग्लोबलस्कोप ऑब्जेक्ट के समापन ध्वज को सत्य पर सेट करें।

2) यदि वर्करग्लोबलस्कोप ऑब्जेक्ट की घटना लूप की कार्य कतार में कोई कार्य कतारबद्ध है, तो उन्हें संसाधित किए बिना उन्हें छोड़ दें।

3) वर्तमान में कार्यकर्ता में चल रही स्क्रिप्ट को रोकें।

4) यदि कार्यकर्ता WorkerGlobalScope वस्तु वास्तव में एक DedicatedWorkerGlobalScope वस्तु नहीं है (यानी कार्यकर्ता एक समर्पित कार्यकर्ता है), तो बंदरगाह कर्मी का अंतर्निहित पोर्ट के साथ उलझा है के बंदरगाह संदेश कतार खाली।

और यह विनिर्देश का केवल एक हिस्सा है।

तो फिर क्यों? यह कार्यकर्ता अंतरिक्ष में होने वाली घटनाओं की कुलता का प्रबंधन करने में सक्षम होना है। कार्यान्वयन श्रमिकों को समानांतर या पूरी तरह से पागल हो जाना चाहिए। :)

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