2012-04-04 13 views
6

मैं एक http सर्वर होस्ट करने वाले वैश्विक सरणी में डेटा संग्रहीत करने के लिए this approach का उपयोग कर रहा हूं जहां कुछ अनुरोध वैश्विक सरणी में हेरफेर करेंगे।नोड में कौन से ऑपरेशन थ्रेड सुरक्षित हैं?

मैं कुछ परिचालनों के साथ थ्रेडिंग मुद्दों में चलने के बारे में चिंतित हूं - मुख्य रूप से push और splice। मुझे कल्पना है कि अगर एक अनुरोध ने मुझे सरणी पर पुन: प्रयास किया है और एक सशर्त के आधार पर वस्तुओं को हटा रहा है, जबकि एक और अनुरोध ने मुझे .push() पर सरणी पर कॉल किया है जो मैं मुद्दों में चलाऊंगा। क्या कोई इसकी पुष्टि कर सकता है?

मैं ज्यादातर सी # में लिखता हूं जहां एक साधारण वृद्धि भी धागा सुरक्षित नहीं है (25 + थ्रेड जो मैं करता हूं, लॉन्च करता हूं, यह गारंटी नहीं देगा कि मैं == 25 सब कुछ कहा और किया जाता है)।

अद्यतन:

मैं 5 उदाहरण लिखा है प्रदर्शित करने के लिए मैं क्या बारे में बात कर रहा हूँ। टेस्ट 1 और टेस्ट 3 काम ठीक है। परीक्षण 2 विफल रहता है, क्योंकि अच्छी तरह से ... सामान्य रूप से थ्रेडिंग मुद्दों को कहा जाएगा (चाहे वे वास्तविक CPU धागे हैं या नहीं)। टेस्ट 4 और 5, जब समानांतर में चलते हैं तो काम करते हैं (जिसका अर्थ है कि उन्हें टेस्ट 2 जैसे टकराव की समस्या नहीं है)।

http://pastebin.com/HcJHTDFY

मैं ApacheBench उपयोग कर रहा हूँ परीक्षण करने के लिए, 1000 समानांतर अनुरोध करने की।

इस ओर जाता है मुझे विश्वास है कि टेस्ट 1 और टेस्ट 3 काम ठीक क्योंकि NodeJS समानांतर में app.get('/test3'...) कॉलबैक से अधिक 1 उदाहरण पर अमल नहीं होगा समानांतर में जावास्क्रिप्ट समारोह (अवरुद्ध?)। जैसे ही आप एक सेट इंटरवल/सेटटाइमआउट को कार्यान्वित करते हैं, यह कॉलबैक (गैर-अवरुद्ध?) के दूसरे उदाहरण को निष्पादित करने के लिए नोडजेज़ को मुक्त करता है।

मैं वास्तव में यह समझने की कोशिश कर रहा हूं कि बिल्ली non-blocking I/O model वास्तव में क्या है। क्या इसका मतलब यह है कि "हे सेटटाइमआउट और सेट इंटरवल के साथ गैर-अवरुद्ध करना संभव है यदि आपको गैर-अवरुद्ध करने की आवश्यकता है, अन्यथा हम किसी अन्य बाहरी स्तर के कार्यों को तब तक अवरुद्ध करने जा रहे हैं जब तक हम उस कार्य को समाप्त नहीं करते जब तक हम उस कार्य को समाप्त नहीं करते हैं" ? मुझे लगता है कि यह जानना जरूरी है कि मुझे खुद को परेशानी में न लगे क्योंकि मैं कुछ/test2 जैसे कुछ लागू कर सकता हूं और पूरी तरह सुरक्षित हूं।

अगर मैं अपने कॉलबैक के साथ गैर-अवरुद्ध होने की कोशिश कर रहा हूं, तो क्या मुझे वास्तव में setTimeout(code, 1) पर कॉल करना चाहिए? या कोई बेहतर तरीका है?

उत्तर

10

सभी धागे सुरक्षित हैं।

कोई धागा नहीं है, जावास्क्रिप्ट एकल धागा है, एक ही समय में दो जावास्क्रिप्ट कथन चलाने के लिए असंभव है।

एक के रूप में अलग रूप में, आप वैश्विक नहीं का उपयोग करना चाहिए वैसे भी, क्योंकि वैश्विक

संपादित बुराई कर रहे हैं:

टेस्ट 2 विफल रहता है क्योंकि आप, अतुल्यकालिक कॉलबैक का उपयोग कर रहे हैं जो नियंत्रण का मतलब नोड के लिए वापस चला जाता है और यह अधिक अनुरोध संभाल सकता है। यह दौड़ की स्थिति बनाता है जैसा देखा गया है।

नोड में, जो कुछ भी अतुल्यकालिक ब्लॉक नहीं है। आपके पास एकमात्र एसिंक्रोनस चीजें हैं जो टाइमटाइम/सेट इंटरवल/process.nextTick और किसी भी एसिंक्रोनस आईओ ऑपरेशंस हैं।

किसी को मैन्युअल रूप से गणना नहीं करना चाहिए।किसी को बहुत अधिक गणना करने से बचना चाहिए।

मैं एक लेख लिखा है के बारे में What it means to be non-blocking

+0

तो जब नोडजेएस/वी 8 एक फ़ंक्शन() {} में लिखा जाता है, तो मैंने लिखा है कि मेरे किसी भी अन्य कार्य को निष्पादित नहीं किया जाएगा, जिन्हें मैं अंदर कॉल करता हूं (कॉलबैक के रूप में)? – Langdon

+0

वैसे, जावास्क्रिप्ट एकल थ्रेडेड हो सकता है, लेकिन नोडजेएस बहु-थ्रेडेड प्रतीत होता है, अन्यथा अंतर्निहित HTTP सर्वर के बाद के अनुरोध पहले तक समाप्त होने तक वापस नहीं आ पाएंगे। इसके अलावा http://stackoverflow.com/questions/7018093/nodejs-really-single-threaded – Langdon

+0

@ लैंगडन चाहे वह बहु थ्रेड हो या नहीं, एक कार्यान्वयन विवरण है जिस पर आपको परवाह नहीं है। यह सब एसिंक्रोनस आईओ है, या तो सीधे कर्नेल स्तर पर या थ्रेड पूल – Raynos

-5

Raynos ज्यादातर सही है। लेकिन सिर्फ इसलिए कि जावास्क्रिप्ट एकल धागा है इसका मतलब यह नहीं है कि आप अपने गार्ड को नीचे छोड़ सकते हैं। आपको अभी भी धागे से अवगत होना चाहिए। इसका वर्णन करने के लिए एक अच्छा उदाहरण यह है कि socket.io ग्राहकों को बदलता रहता है और फिर भी इन ग्राहकों का ट्रैक रखने में सक्षम होता है।

जावास्क्रिप्ट का कार्यात्मक प्रोग्रामिंग भाग चर बाध्यकारी (जैसे ... एक एलओटी) द्वारा काम करता है। धागे से अवगत नहीं होने से आपको झूठा लगता है कि आपके चर सही ढंग से बंधे हैं। Socket.io उदाहरण की तरह, आप कैसे सुनिश्चित कर सकते हैं कि आप जो कनेक्शन प्राप्त कर रहे हैं वह ग्राहक है जो आपको लगता है कि आपको मिल रहा है? क्या होगा यदि संदर्भ बाध्यकारी गलत हो गया और कनेक्शन वास्तव में एक अलग ग्राहक का संदर्भ देता है?

यह उन चीज़ों का प्रकार है जिनके बारे में आपको सावधान रहना चाहिए।

+1

जावास्क्रिप्ट संदर्भ द्वारा पास नहीं किया गया है। वह और जिस बकवास के बारे में आप बात करते हैं उसके पास धागे से कोई लेना देना नहीं है। node.js थ्रेड का भी उपयोग नहीं करता है यदि ओएस कर्नेल स्तर – Raynos

+0

@lightblade Haters पर 0 एसिंक IO का समर्थन करता है ... – Langdon

+1

वास्तविक प्रतिक्रिया/आलोचना देने के लिए। "संदर्भ बाध्यकारी गलत कब होगा"। कनेक्शन एक अलग "ग्राहक" संदर्भ कब होगा। हां वहाँ समेकन जाल हैं जिनके बारे में आपको अवगत होना चाहिए, लेकिन आप उनका वर्णन नहीं कर रहे हैं और वे धागे से संबंधित नहीं हैं – Raynos

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