मैं एक http सर्वर होस्ट करने वाले वैश्विक सरणी में डेटा संग्रहीत करने के लिए this approach का उपयोग कर रहा हूं जहां कुछ अनुरोध वैश्विक सरणी में हेरफेर करेंगे।नोड में कौन से ऑपरेशन थ्रेड सुरक्षित हैं?
मैं कुछ परिचालनों के साथ थ्रेडिंग मुद्दों में चलने के बारे में चिंतित हूं - मुख्य रूप से push
और splice
। मुझे कल्पना है कि अगर एक अनुरोध ने मुझे सरणी पर पुन: प्रयास किया है और एक सशर्त के आधार पर वस्तुओं को हटा रहा है, जबकि एक और अनुरोध ने मुझे .push()
पर सरणी पर कॉल किया है जो मैं मुद्दों में चलाऊंगा। क्या कोई इसकी पुष्टि कर सकता है?
मैं ज्यादातर सी # में लिखता हूं जहां एक साधारण वृद्धि भी धागा सुरक्षित नहीं है (25 + थ्रेड जो मैं करता हूं, लॉन्च करता हूं, यह गारंटी नहीं देगा कि मैं == 25 सब कुछ कहा और किया जाता है)।
अद्यतन:
मैं 5 उदाहरण लिखा है प्रदर्शित करने के लिए मैं क्या बारे में बात कर रहा हूँ। टेस्ट 1 और टेस्ट 3 काम ठीक है। परीक्षण 2 विफल रहता है, क्योंकि अच्छी तरह से ... सामान्य रूप से थ्रेडिंग मुद्दों को कहा जाएगा (चाहे वे वास्तविक CPU धागे हैं या नहीं)। टेस्ट 4 और 5, जब समानांतर में चलते हैं तो काम करते हैं (जिसका अर्थ है कि उन्हें टेस्ट 2 जैसे टकराव की समस्या नहीं है)।
मैं ApacheBench उपयोग कर रहा हूँ परीक्षण करने के लिए, 1000 समानांतर अनुरोध करने की।
इस ओर जाता है मुझे विश्वास है कि टेस्ट 1 और टेस्ट 3 काम ठीक क्योंकि NodeJS समानांतर में app.get('/test3'...)
कॉलबैक से अधिक 1
उदाहरण पर अमल नहीं होगा समानांतर में जावास्क्रिप्ट समारोह (अवरुद्ध?)। जैसे ही आप एक सेट इंटरवल/सेटटाइमआउट को कार्यान्वित करते हैं, यह कॉलबैक (गैर-अवरुद्ध?) के दूसरे उदाहरण को निष्पादित करने के लिए नोडजेज़ को मुक्त करता है।
मैं वास्तव में यह समझने की कोशिश कर रहा हूं कि बिल्ली non-blocking I/O model
वास्तव में क्या है। क्या इसका मतलब यह है कि "हे सेटटाइमआउट और सेट इंटरवल के साथ गैर-अवरुद्ध करना संभव है यदि आपको गैर-अवरुद्ध करने की आवश्यकता है, अन्यथा हम किसी अन्य बाहरी स्तर के कार्यों को तब तक अवरुद्ध करने जा रहे हैं जब तक हम उस कार्य को समाप्त नहीं करते जब तक हम उस कार्य को समाप्त नहीं करते हैं" ? मुझे लगता है कि यह जानना जरूरी है कि मुझे खुद को परेशानी में न लगे क्योंकि मैं कुछ/test2 जैसे कुछ लागू कर सकता हूं और पूरी तरह सुरक्षित हूं।
अगर मैं अपने कॉलबैक के साथ गैर-अवरुद्ध होने की कोशिश कर रहा हूं, तो क्या मुझे वास्तव में setTimeout(code, 1)
पर कॉल करना चाहिए? या कोई बेहतर तरीका है?
तो जब नोडजेएस/वी 8 एक फ़ंक्शन() {} में लिखा जाता है, तो मैंने लिखा है कि मेरे किसी भी अन्य कार्य को निष्पादित नहीं किया जाएगा, जिन्हें मैं अंदर कॉल करता हूं (कॉलबैक के रूप में)? – Langdon
वैसे, जावास्क्रिप्ट एकल थ्रेडेड हो सकता है, लेकिन नोडजेएस बहु-थ्रेडेड प्रतीत होता है, अन्यथा अंतर्निहित HTTP सर्वर के बाद के अनुरोध पहले तक समाप्त होने तक वापस नहीं आ पाएंगे। इसके अलावा http://stackoverflow.com/questions/7018093/nodejs-really-single-threaded – Langdon
@ लैंगडन चाहे वह बहु थ्रेड हो या नहीं, एक कार्यान्वयन विवरण है जिस पर आपको परवाह नहीं है। यह सब एसिंक्रोनस आईओ है, या तो सीधे कर्नेल स्तर पर या थ्रेड पूल – Raynos