2013-05-25 7 views
11

निम्नलिखित आंकड़े जॉन रेसिग द्वारा Secrets of the JavaScript Ninja पुस्तक के अध्याय 3 से लिया गया है। यहां लेखक ब्राउजर इवेंट लूप समझा रहा है।ब्राउज़र में चल रहे जावास्क्रिप्ट की एकल थ्रेड अवधारणा

enter image description here

पुस्तक इस में क्या कहना है:

यह ध्यान रखें कि ब्राउज़र तंत्र कतार पर घटनाओं डालता है इस घटना पाश मॉडल के लिए बाहरी है महत्वपूर्ण है। प्रसंस्करण यह निर्धारित करने के लिए आवश्यक है कि घटनाएं कब हुई हैं और पर उन्हें धक्का देने के लिए इवेंट कतार ईवेंट को संभालने वाले थ्रेड में भाग नहीं लेती है। कहने के लिए

तो मेरे सवाल यह सही है कि ब्राउज़र में जावास्क्रिप्ट एकल लड़ी है? मैं इस सवाल से पूछता हूं क्योंकि स्पष्ट रूप से दो अलग-अलग कार्य (घटनाओं और घटना कतार को संसाधित करना समानांतर में चल रहा है)।

+0

ऊपर सवाल (शायद) और भी दिलचस्प तथाकथित ** तत्काल कॉलबैक द्वारा निहितार्थ हो सकता है ** बनाना (में सुझाव के रूप में [इस उत्तर] (http://stackoverflow.com/a/2734311/1711186))। कम इस तरह के एक ** तत्काल कॉलबैक में **, जावास्क्रिप्ट कोड रन होगा, जबकि अन्य कोड (यानी 'चेतावनी()') अभी तक नहीं [पूरा होने से चलाने] है (https://developer.mozilla.org एक अवरुद्ध बयान से रुका /en-US/docs/Web/JavaScript/Guide/EventLoop#.22Run-to-completion.22)। ऐसा लगता है कि दूसरा कार्य "घटना कतार" बहु-थ्रेड समस्याओं (यानी निर्धारणा) पेश कर सकता है। अच्छा प्रश्न! की – humanityANDpeace

+0

संभव डुप्लिकेट [जावास्क्रिप्ट एकल पिरोया होने की गारंटी है?] (http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded) – Liam

उत्तर

9

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

संपादित अपने संपादित जवाब देने के लिए:

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

संपादित करें: इसे साबित करने का एक तरीका: वास्तव में एक लंबा लूप और एक टेक्स्ट क्षेत्र बनाएं। पाठ में लिखने का प्रयास करें जबकि लूप चल रहा है। आप नहीं कर सकते: ऐसा इसलिए है क्योंकि मुख्य पाश लूप चलाने में व्यस्त है, इसलिए यह केबी घटनाओं को संभाल नहीं सकता है।

संपादित करें: Is JavaScript guaranteed to be single-threaded?

2 साल पिछले संपादित के बाद:: इस सवाल का जवाब एक छोटा सा पुराना है और वास्तविकता से अलग हो रही है यह एक बहुत अच्छी जवाब हो रहा है। इसके बाद io.js (और node.js, शायद क्रोम [ई | ium], एफएफ, सफारी उसके बाद) मल्टीप्रोसेस समर्थन (श्रमिकों के माध्यम से) की तरफ बढ़ रहा है। आप उस here के बारे में और अधिक जांच सकते हैं।

+0

@alexandernst जब से तुम बोली [ क्या जावास्क्रिप्ट एकल-थ्रेडेड होने की गारंटी है?] (Http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded?rq=1) प्रश्न मुझे आश्चर्य होगा कि क्या आप चाहेंगे कथन पर पुनर्विचार करें "AFAIK [...] सबकुछ संभालता है (यानी, कतार भरना और चलाना, ** लाइन-बाय-लाइन **, कोई जेएस कोड)"? मूलमंत्र ** तत्काल कॉलबैक ** के रूप में बुद्धिमानी से [इस सवाल का जवाब toprunning] में आपका उल्लेख है (http://stackoverflow.com/a/2734311/1711186)। तुम क्या सोचते हो? – humanityANDpeace

+0

@ ह्यूमनिटीन्पेस वास्तव में यह एक दिलचस्प पढ़ा है।मुझे सच में यकीन नहीं है कि प्रत्येक ब्राउज़र एक ऐसी स्थिति को कैसे संभालेगा जिसमें आप वास्तव में कोड का एक लंबा ब्लॉक चला रहे हैं और तत्काल कॉलबैक निकाल दिया गया है। वैसे भी, एक बात मैं आपको आश्वस्त कर सकता हूं: यदि आप इस अवधारणा पर रिले करते हैं, तो यह गारंटी देगा, गारंटीकृत होगी। जेएस किसी भी तरह का/मल्टीथ्रेडिंग/मल्टीप्रोसेस/बहुविवाह चलाने के लिए नहीं है। – alexandernst

+0

@alexandernst मैंने कुछ और जांच की। फ़ायरफ़ॉक्स का उपयोग करके मैं ** तत्काल कॉलबैक/ईवेंट ** के ऐसे "सहायक नहीं" व्यवहार को पुन: पेश कर सकता हूं जब मैं कुछ निष्पादन को रोकने के लिए 'चेतावनी() 'का उपयोग करता हूं। मुझे अभी भी आश्चर्य है कि यह सिर्फ फ़ायरफ़ॉक्स का एक बग है। क्या आपको यह जानने के लिए चश्मा पढ़ने में खुशी हुई है कि "कश्य" को समेकन संभालने का तरीका क्या होना चाहिए? – humanityANDpeace

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