2012-01-22 17 views
29

जावास्क्रिप्ट कोड के बारे में बात करने देता है जिसमें setInterval विधियां प्रत्येक 2 सेकेंड हैं।क्या एसिंक प्रोग्रामिंग का अर्थ बहु-थ्रेडिंग है?

मेरे पास कुछ नियंत्रण के लिए onblur एनीमेशन ईवेंट भी है।

ऐसे मामले में जहां onblur होता है (+ एनीमेशन), मुझे setInterval फ़ंक्शन मिल सकता है।

तो मेरे सवाल है:
करता Async प्रोग्रामिंग मतलब बहु सूत्रण? (किसी भी तरह से?)

मुझे पता है कि जावास्क्रिप्ट एक बहु-थ्रेडिंग भाषा नहीं है।

तो ...?

+3

नहीं, asynchronicity (ism?) * समानता की आवश्यकता नहीं है *। कवर के तहत –

+0

धागे हैं, लेकिन एक प्रोग्रामर/भाषा उपभोक्ता के रूप में यह नहीं है। – Jason

+2

@ जेसन कवर के नीचे कोई धागा नहीं है। या कम से कम वहाँ होना जरूरी नहीं है। – Raynos

उत्तर

62

नहीं। इसका मतलब सचमुच इसका मतलब है - असीमित। प्रोग्रामर के रूप में आपकी सफलता के लिए एसिंक्रोनस प्रोग्रामिंग और थ्रेड-आधारित प्रोग्रामिंग के बीच अंतर को समझना महत्वपूर्ण है।

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

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

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

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

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

+1

jQuery में AJAX कॉल के बारे में क्या है, सर्वर साइड कोड इसकी सामग्री करता है जबकि मेरा ब्राउज़र अन्य कार्यों को करता है .....? –

+6

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

+5

एक अच्छा जवाब, यह समझाने के लिए धन्यवाद कि एक उचित शब्दकोष मुक्त तरीके से – Jason

0

केवल इस अर्थ में कि यह कोड को खतरनाक रूप से निष्पादित करता है और दौड़ की स्थिति को जोखिम देता है। आपको टाइमआउट और अंतराल का उपयोग करने से कोई प्रदर्शन लाभ नहीं मिलेगा।

हालांकि, एचटीएमएल 5 के WebWorkers ब्राउज़र में वास्तविक बहु सूत्रण के लिए अनुमति है: http://www.html5rocks.com/en/tutorials/workers/basics/

5

एक एकल थ्रेड घटना पाश एक भी लड़ी भाषा में अतुल्यकालिक होने का एक अच्छा उदाहरण है।

यहां अवधारणा यह है कि आप doLater कॉलबैक हैंडलर eventLoop पर संलग्न करते हैं। फिर eventLoop सिर्फ while(true) है जो यह जांचता है कि प्रत्येक doLater हैंडलर के लिए विशिष्ट टाइमस्टैम्प पूरा हो गया है, और यदि ऐसा है तो यह हैंडलर को कॉल करता है।

रुचि रखने वालों के लिए, यहाँ एक single threaded event loop in JavaScript

की एक भोली (और बुरी तरह अक्षम खिलौना) कार्यान्वयन इसका मतलब यह है कि आपके एकल थ्रेड, के ओएस धागा अनुसूचक पहुँच के किसी भी प्रकार के बिना अपने व्यस्त इंतजार करने के लिए मजबूर है doLater कॉलबैक।

आप एक sleep कॉल तुम सिर्फ अगले doLater हैंडलर जो अधिक कुशल तो एक व्यस्त इंतजार है, क्योंकि आप अपने एकल थ्रेड deschedule और ओएस अन्य कार्य करने देते हैं जब तक sleep कर सकता है।

-3

यदि कोई कॉलबैक है, तो उसे कुछ कॉल करना होगा। निष्पादन की इकाइयां & धागे हैं, इसलिए, हाँ, कुछ अन्य थ्रेड को कॉलबैक को कॉल करना है, या तो सीधे या प्रारंभिक थ्रेड पर कुछ एसिंक्रोनस प्रक्रिया कॉल को कतारबद्ध करना है।

+0

बाद में कॉलबैक को कॉल करने के लिए _same एकल thread_ के लिए यह पूरी तरह से संभव है। – Raynos

+0

@ रेनोस कैसे? यदि एक धागा सीधे एक समारोह को कॉल करता है, तो इसे सिर्फ 'कॉल' कहा जाता है। यदि कुछ इनपुट लूप पर कॉलबैक को थ्रेड में इंगित किया गया है, तो कुछ ने कॉलबैक कतारबद्ध करनी होगी। एक ड्राइवर सीधे यह कर सकता है, लेकिन यह आमतौर पर एक कर्नेल धागा है। –

+0

पूरे ईवेंट लूप को एक थ्रेड में लाइव करके। ध्यान दें कि धागा किसी भी आईओ नहीं कर सकता है, यह केवल अपने साथ और एकल धागे के भीतर कुछ भी असीमित संचार कर सकता है। यह पैडेंट्री हो सकता है। – Raynos

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