2010-11-17 18 views
8

ग्रीटिंग्स,जावास्क्रिप्ट - घटना संचालित और समवर्ती मुद्दों?

मैं जावास्क्रिप्ट, नोडजेस का अध्ययन कर रहा हूं। और मुझे समझ में नहीं आता कि जावास्क्रिप्ट में समवर्ती मुद्दों से कैसे बचा जाता है।

चलें कहते हैं कि मैं एक वस्तु

var bigObject = new BigObject(); 

पर काम कर रहा हूँ और मैं एक setTimer(function(){ workOnBigOjbect...}) कि भी bigOjbect पर काम करते हो जाएगा।

मैं है डिस्क आईओ bigObject में लिखा जा रहा है, और एक टाइमर वस्तु bigObject पर काम कर रहा है, और नियमित रूप से कोड bigObject से पढ़ रहे हैं, तो कैसे संगामिति मुद्दों परहेज कर रहे हैं?

नियमित भाषा में, मैं एक म्यूटेक्स या थ्रेड-सुरक्षित कतार/कमांड पैटर्न का उपयोग करूंगा। मुझे जावास्क्रिप्ट के लिए दौड़ की स्थिति के बारे में भी ज्यादा चर्चा नहीं दिखाई देती है।

क्या मुझे कुछ याद आ रही है?

उत्तर

9

नोड.जेएस का पूरा बिंदु यह है कि यह घटना संचालित है। सभी कोड एक ही थ्रेड में ईवेंट हैंडलर में चलता है। कोई सहमति नहीं है क्योंकि कोड समवर्ती रूप से नहीं चलता है। नकारात्मकता यह है कि प्रत्येक ईवेंट हैंडलर को तुरंत बाहर निकलना चाहिए क्योंकि यह अन्य घटनाओं को अवरुद्ध करता है।

आपके उदाहरण में, कोड डिस्क IO शुरू करेगा और तत्काल बाहर निकल जाएगा। Node.js आधारभूत संरचना प्रोग्राम को सूचित करेगी कि आईओ ऑपरेशन एक ईवेंट हैंडलर चलाकर पूरा हो गया था। आईओ कार्यक्रम से पहले या बाद में टाइमर इवेंट को बुलाया जाएगा, लेकिन समवर्ती रूप से कभी नहीं।

+3

* scrrraatchhhhh * मेरे सिर में घुमावदार गियर्स की आवाज! मुझे यह मिल रहा है, लेकिन मुझे इस पर कुछ और मध्यस्थता करने की जरूरत है। – Daniel

+1

इसे समझने का सबसे अच्छा तरीका इसका उपयोग करना है - node.js. में कुछ छोटे प्रोग्राम लिखें – Amnon

+0

@ डैनियल, क्या आपका मतलब ध्यान करना था? :) इसके अलावा, मुझे लगता है कि मैंने अभी अपने सिर में एक ही आवाज सुनी है। कितनी बार - मेरे मस्तिष्क अलग होने से पहले भाषाओं और प्लेटफार्मों के बीच आगे और आगे जा रहे हैं? – snapfractalpop

3

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

2

केवल एक ही धागा है; देखें: Node.js on multi-core machines

मैं अनुमान लगाता हूं कि ऐसा इसलिए है क्योंकि एकाधिक थ्रेड अंतर्निहित वी 8 जावास्क्रिप्ट इंजन में समर्थित नहीं हैं क्योंकि आम तौर पर जावास्क्रिप्ट ब्राउज़र में निष्पादित होता है (जहां विंडोज़ मामले में केवल एक ही यूआई थ्रेड होता है) और समर्थन नहीं करता है एकाधिक धागे

+0

यह वास्तव में एक डिजाइन निर्णय है: प्रक्रिया node.js. की मौलिक इकाई है। किसी भी मामले में, जावास्क्रिप्ट एक घटनाबद्ध भाषा है इसलिए थ्रेड वास्तव में समझ में नहीं आता है। – xj9

1

जावास्क्रिप्ट में यह बात Run-to-Completion कहलाती है जो सुनिश्चित करता है कि यदि कोई कोड निष्पादित हो रहा है तो यह किसी भी अन्य (एसिंक्रोनस) कोड चलाने से पहले पूरी तरह से निष्पादित होता है, इसलिए, कोई सहमति नहीं है।

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

Why no concurrency control tool in javascript देखें।

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