2011-11-01 12 views
5

मैं हमेशा सुनता हूं कि जावास्क्रिप्ट एकल-थ्रेडेड है; जब जावास्क्रिप्ट को निष्पादित किया जाता है, तो यह सब एक ही वैश्विक मोश गड्ढे में चलाया जाता है, सब एक ही धागे में।जावास्क्रिप्ट और सिंगल थ्रेडेनेस

हालांकि यह सच हो सकता है, कि एकल निष्पादन धागा नए धागे को उत्पन्न कर सकता है, एसिंक्रोनोसिस डेटा को मुख्य थ्रेड पर वापस प्राप्त कर सकता है, सही? उदाहरण के लिए, जब कोई XMLHttpRequest भेजा जाता है, तो क्या ब्राउज़र एक नया थ्रेड बनाता है जो HTTP लेनदेन करता है, फिर XMLHttpRequest लौटने पर मुख्य थ्रेड में कॉलबैक वापस लेता है?

टाइमर के बारे में क्या - सेटटाइमआउट और सेट इंटरवल? वे कैसे काम करते हैं?

क्या यह सिंगल-थ्रेडेनेस भाषा का परिणाम है? नए वेब वर्कर्स ड्राफ्ट से पहले बहु-थ्रेडेड निष्पादन होने से जावास्क्रिप्ट को क्या रोक दिया है?

+0

जावास्क्रिप्ट दुभाषिया अक्सर ब्राउज़र यूआई थ्रेड – david

+2

साझा करते हैं, अगली बार जब मैं वैश्विक दायरे के बारे में बात कर रहा हूं, तो मैं ** वैश्विक मॉश गड्ढे ** :) –

+0

inb4 HTML5 वेब श्रमिकों का उपयोग करने जा रहा हूं – Ben

उत्तर

3

जावास्क्रिप्ट ईवेंट कतार कैसे काम करता है, इसके विवरण के लिए this post देखें, जिसमें यह AJAX कॉल से संबंधित है।

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

4

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

टाइमर और अंतराल आपके जावास्क्रिप्ट को बाद में चलाने की कोशिश करेंगे, लेकिन यदि आपके पास while(1){ ; } चल रहा है इसे बाधित करने के लिए एक टाइमर या अंतराल।

(संपादित करें: कुछ छोड़ दिया गया है।) सिंगल-थ्रेडेनेस मुख्य रूप से ईसीएमए विनिर्देश का परिणाम है। कई धागे से निपटने के लिए वास्तव में कोई भाषा संरचना नहीं है। जावास्क्रिप्ट दुभाषिया को कई धागे और उनके साथ बातचीत करने के लिए उपकरण लिखना असंभव नहीं होगा, लेकिन कोई भी वास्तव में ऐसा नहीं करता है। निश्चित रूप से कोई भी वेब ब्राउज़र में ऐसा नहीं करेगा; यह गड़बड़ सब कुछ ऊपर होगा। (यदि आप कुछ सर्वर-साइड जैसे Node.js कर रहे हैं, तो आप देखेंगे कि उन्होंने स्नैज़ी इवेंट लूप, और वैकल्पिक मल्टी-प्रोसेसिंग के पक्ष में जावास्क्रिप्ट में मल्टीथ्रेडिंग को छोड़ दिया है।)

6

XMLHttpRequest, विशेष रूप से , वर्तमान धागे को अवरुद्ध नहीं करता है। हालांकि, रनटाइम के भीतर इसके विनिर्देश किसी विनिर्देश में उल्लिखित नहीं हैं। यह एक अलग थ्रेड में या वर्तमान धागे के भीतर, गैर-अवरुद्ध I/O का उपयोग कर सकता है।

setTimeout और setInterval सेट टाइमर है कि, जब शून्य हो जाने पर चलाने के लिए, निष्पादन के लिए एक आइटम जोड़ने, या तो एक समारोह/कॉलबैक के कोड की एक पंक्ति, निष्पादन ढेर, अगर कोड निष्पादन बंद कर दिया है जावास्क्रिप्ट इंजन शुरू करने के लिए। दूसरे शब्दों में, वे जावास्क्रिप्ट इंजन को कुछ भी करने के बाद बताते हैं कि यह जो भी हो रहा है, वह कर रहा है। इसे क्रिया में देखने के लिए, एक विधि के भीतर एकाधिक setTimeout (ओं) सेट करें और इसे कॉल करें।

0

ब्राउज़र में नौकरी करने के लिए अन्य धागे हो सकते हैं लेकिन आपका जावास्क्रिप्ट कोड अभी भी एक थ्रेड में निष्पादित किया जाएगा। यहां यह अभ्यास में कैसे काम करेगा।

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

AJAX अनुरोध इसी तरह काम करेगा। कुछ ब्राउज़र आंतरिक थ्रेड वास्तव में सर्वर से कनेक्ट हो सकते हैं और प्रतिक्रिया के लिए प्रतीक्षा कर सकते हैं और एक बार प्रतिक्रिया उपलब्ध होती है, मुख्य ईवेंट कतार पर उपयुक्त संदेश स्थानांतरित होता है, इसलिए मुख्य धागा हैंडलर निष्पादित करता है।

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

0

सामान्य रूप से (उन ब्राउज़रों के लिए जिन्हें मैं जानता हूं) के लिए बात करने से अधिक सरलता से रखकर, किसी भी समय जावास्क्रिप्ट निष्पादन का केवल एक ब्लॉक होगा।

जब आप एक अतुल्यकालिक Ajax अनुरोध कर सकते हैं या setTimeout या setInterval फोन ब्राउज़र प्रबंधन कर सकते हैं उन्हें एक सूत्र में है, लेकिन जब तक कोड के वर्तमान में क्रियान्वित ब्लॉक के बाद कुछ बिंदु खत्म कॉलबैक में वास्तविक जे एस कोड निष्पादित नहीं होंगे। यह सिर्फ कतारबद्ध हो जाता है।

इस प्रदर्शन करने के लिए एक साधारण परीक्षण है कि यदि आप एक setTimeout के बाद, लेकिन एक ही ब्लॉक में अपेक्षाकृत लंबी चलने कोड का एक टुकड़ा डाल: यदि आप चलाते हैं तो आप के ऊपर "के बाद setTimeout देखेंगे

setTimeout("alert('Timeout!');", 5); 
alert("After setTimeout; before loop");  
for (var i=0, x=0; i < 2000000; i++) { x += i }; 
alert("After loop"); 

"अलर्ट, फिर लूप चलाते समय एक विराम होगा, फिर आप" लूप के बाद "देखेंगे, और उसके बाद ही आप" टाइमआउट "देखेंगे! - भले ही 5ms से अधिक लंबा स्पष्ट हो गया हो (विशेष रूप से यदि आप पहली चेतावनी को बंद करने में कुछ समय लेते हैं)।

सिंगल-थ्रेड के लिए अक्सर उद्धृत कारण यह है कि यह पृष्ठ को प्रतिपादित करने के ब्राउज़र के काम को सरल बनाता है, क्योंकि आपको जावास्क्रिप्ट के कई अलग-अलग धागे की स्थिति नहीं मिलती है, जो सभी डीओएम को अपडेट करने की कोशिश कर रहे हैं पहर।

0

जावास्क्रिप्ट एक भाषा को एम्बेड करने के लिए डिज़ाइन किया गया है। यह उन प्रोग्रामों में उपयोग किया जा सकता है जो विभिन्न ऑपरेटिंग थ्रेड पर एक साथ जावास्क्रिप्ट निष्पादित करते हैं। निष्पादन के नए धागे के निर्माण को स्पष्ट रूप से नियंत्रित करने के लिए एक एम्बेडेड भाषा की अधिक मांग नहीं है, लेकिन यह निश्चित क्षमताओं के साथ मेजबान वस्तु प्रदान करके निश्चित रूप से किया जा सकता है। WHATWG वास्तव में includes a justification for their decision not to push a standard concurrent execution capability for browsers

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