2011-03-30 12 views
22

मुझे आश्चर्य है कि क्या modexes/locks को node.js. के भीतर डेटा एक्सेस के लिए आवश्यक है। उदाहरण के लिए, मान लें कि मैंने एक सरल सर्वर बनाया है। सर्वर एक आंतरिक सरणी से जोड़ने और निकालने के लिए दो प्रोटोकॉल विधियों को प्रदान करता है। क्या मुझे आंतरिक सरणी को किसी प्रकार के म्यूटेक्स से बचाने की ज़रूरत है?नोड.जेएस और म्यूटेक्स

मैं समझता हूं कि जावास्क्रिप्ट (और इस प्रकार Node.js) एकल थ्रेडेड है। मैं इस बात पर स्पष्ट नहीं हूं कि घटनाओं को कैसे संभाला जाता है। घटनाओं में बाधा आती है? यदि ऐसा है, तो मेरा ऐप सरणी पढ़ने के बीच में हो सकता है, किसी इवेंट कॉलबैक को चलाने के लिए बाधित हो जाता है जो सरणी को बदलता है, और तब उस सरणी को प्रोसेस करना जारी रखता है जिसे अब ईवेंट कॉलबैक द्वारा बदला गया है।

उत्तर

20

मुझे आश्चर्य है कि क्या modexes/locks को node.js. के भीतर डेटा एक्सेस के लिए आवश्यक है।

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

मैं समझता हूं कि जावास्क्रिप्ट (और इस प्रकार Node.js) एकल थ्रेडेड है। मैं इस बात पर स्पष्ट नहीं हूं कि घटनाओं को कैसे संभाला जाता है। घटनाओं में बाधा आती है?

नहीं, घटनाएं बाधित नहीं होती हैं। उदाहरण के लिए, यदि आप अपने कोड में while(true){} डालते हैं, तो यह किसी अन्य कोड को निष्पादित होने से रोक देगा, क्योंकि लूप को चलाने के लिए हमेशा एक और पुनरावृत्ति होता है।

यदि आपके पास लंबी दौड़ वाली गणना है, तो process.nextTick का उपयोग करना एक अच्छा विचार है, क्योंकि यह कुछ भी नहीं चल रहा है, जब यह कुछ भी चल रहा है (मैं इस पर अस्पष्ट हूं: नीचे दिया गया उदाहरण दिखाता है कि मैं ' शायद इसके बारे में सही है, शायद निर्बाध चल रहा है)।

यदि आपके कोई अन्य प्रश्न हैं, तो पर रुकने के लिए स्वतंत्र महसूस करें और प्रश्न पूछें। इसके अलावा, मैं एक जोड़े को लोगों से कहा कि इसे देखो और यह सुनिश्चित करें मैं पूरी तरह गलत नहीं कर रहा हूँ बनाने के लिए;)

var count = 0; 

var numIterations = 100; 
while(numIterations--) { 
    process.nextTick(function() { 
    count = count + 1; 
    }); 
} 

setTimeout(function() { 

    console.log(count); 

}, 2); 

// 
//=> 100 
// 

AAA_awright को # Node.js :)

+1

process.nextTick (कॉलबैक) के लिए Node.js दस्तावेज़ के अपने पढ़ने कि यह अगले टिक के लिए कतार में कॉलबैक() जोड़ता है:

तो मैं अपने खुद के समाधान फ़ाइल ताले का उपयोग किया। यह टिकने से पहले टिक टिक या टिक इवेंट लूप चलाने के बारे में कुछ भी नहीं कहता है ... इसलिए मैंने इस कोड को 100 कॉलबैक जोड़ने के रूप में पढ़ा है जो अगले टिक के लिए TODO सूची में ++ गिनती है ... ?? – Paul

+0

@ पॉल सही!/fyi # node.js आईआरसी आपका स्वागत करता है: http://bit.ly/nodeIRC – DTrejo

27

ताले और mutexes का धन्यवाद वास्तव में कभी-कभी आवश्यक होते हैं, भले ही नोड.जेएस एकल-थ्रेडेड हों।

मान लीजिए कि आपके पास दो फाइलें हैं जिनके पास एक ही सामग्री होनी चाहिए और समान सामग्री को असंगत स्थिति नहीं माना जाता है। अब मान लीजिए कि आपको सर्वर को अवरुद्ध किए बिना उन्हें बदलने की जरूरत है। आप ऐसा करते हैं:

fs.writeFile('file1', 'content', function (error) { 
    if (error) { 
     // ... 
    } else { 
     fs.writeFile('file2', 'content', function (error) { 
      if (error) { 
       // ... 
      } else { 
       // ready to continue 
      } 
     }); 
    } 
}); 

आप दो कॉल के बीच एक असंगत स्थिति में गिर जाते हैं, एक ही स्क्रिप्ट में एक और समारोह दो फ़ाइलों को पढ़ने में सक्षम हो सकता है जब।

rwlock मॉड्यूल इन मामलों को संभालने के लिए बिल्कुल सही है।

+0

यही मैंने सोचा था। क्या दूसरा जवाब गलत नहीं है? –

+1

उत्तर वास्तव में गलत नहीं है, क्योंकि सवाल पूछता है "क्या मुझे आंतरिक सरणी को किसी प्रकार के म्यूटेक्स से बचाने की ज़रूरत है?" – sheldonh

+0

मान लें कि आपके पास एक ही कोड चलाने वाले एकाधिक Node.js सर्वर उदाहरण हैं। क्या 'rwlock' मॉड्यूल इस के साथ सौदा करता है या आपको Redis की तरह कुछ चाहिए? –

0

मैं नोड म्यूटेक्स के लिए समाधान की तलाश में था। म्यूटेक्स कभी-कभी जरूरी होते हैं - आप अपने नोड एप्लिकेशन के कई उदाहरण चला सकते हैं और यह आश्वस्त करना चाहते हैं कि उनमें से केवल कुछ ही कुछ खास चीज कर रहा है। मेरे द्वारा प्राप्त किए जा सकने वाले सभी समाधान क्रॉस-प्रोसेस या रेडिस के आधार पर नहीं थे।https://github.com/Perennials/mutex-node

+0

रेडिस के साथ क्या गलत है? क्या तुम मुझे बता सकते हो ? –

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