एक साइड प्रोजेक्ट के रूप में मैं वर्तमान में एक पुराने गेम के लिए एक सर्वर लिख रहा हूं जिसे मैं खेलता था। मैं सर्वर को यथासंभव कम से कम युग्मित करने की कोशिश कर रहा हूं, लेकिन मुझे आश्चर्य है कि मल्टीथ्रेडिंग के लिए एक अच्छा डिजाइन निर्णय क्या होगा। वर्तमान में मैं कार्यों की निम्न क्रम है:कई धागे या जितना संभव हो उतने धागे?
- स्टार्टअप (बनाता है) ->
- सर्वर (ग्राहकों के लिए सुनता है, बनाता है) ->
- क्लाइंट (आदेश के लिए सुनता है और अवधि डेटा भेजता है)
मैं औसत 100 क्लाइंट मान रहा हूं, क्योंकि यह गेम के लिए किसी भी समय अधिकतम था। पूरी चीज के थ्रेडिंग के लिए सही निर्णय क्या होगा? मेरा वर्तमान सेटअप निम्नानुसार है:
- नए कनेक्शन के लिए नए कनेक्शन की सूची में सर्वर पर 1 थ्रेड, क्लाइंट ऑब्जेक्ट बनाते हैं और फिर से सुनना शुरू करते हैं।
- क्लाइंट ऑब्जेक्ट में एक धागा है, आने वाले आदेशों को सुनना और आवधिक डेटा भेजना। यह एक गैर-अवरुद्ध सॉकेट का उपयोग करके किया जाता है, इसलिए यह आसानी से जांचता है कि क्या डेटा उपलब्ध है, उसके साथ सौदा करता है और उसके बाद संदेश भेजता है। प्रेषण चक्र शुरू होने से पहले लॉग इन किया जाता है।
- खेल के लिए एक धागा (अभी के लिए), जैसा कि मुझे लगता है कि पूरे क्लाइंट-सर्वर भाग से अलग होना, वास्तुशिल्प रूप से बोलना।
इसके परिणामस्वरूप कुल 102 धागे होंगे। मैं क्लाइंट 2 धागे देने, एक भेजने के लिए और एक प्राप्त करने पर भी विचार कर रहा हूं। यदि मैं ऐसा करता हूं, तो मैं रिसीवर थ्रेड पर अवरुद्ध I/O का उपयोग कर सकता हूं, जिसका अर्थ है कि थ्रेड औसत स्थिति में अधिकतर निष्क्रिय होगा।
मेरी मुख्य चिंता यह है कि इस कई धागे का उपयोग करके मैं संसाधनों को छेड़छाड़ कर दूंगा। मैं दौड़ की स्थिति या डेडलॉक्स के बारे में चिंतित नहीं हूं, क्योंकि ऐसा कुछ है जिसे मुझे किसी भी तरह से निपटना होगा।
मेरा डिज़ाइन इस तरह से स्थापित किया गया है कि मैं सभी क्लाइंट संचारों के लिए एक थ्रेड का उपयोग कर सकता हूं, भले ही यह 1 या 100 हो। मैंने संचार तर्क को क्लाइंट ऑब्जेक्ट से अलग कर दिया है, इसलिए मैं कर सकता था बहुत सारे कोड को फिर से लिखने के बिना इसे कार्यान्वित करें।
मुख्य प्रश्न यह है: क्या आवेदन में 200 से अधिक धागे का उपयोग करना गलत है? क्या इसमें फायदे हैं? मैं इसे बहु-कोर मशीन पर चलाने के बारे में सोच रहा हूं, क्या यह इस तरह के कई कोरों का बहुत लाभ उठाएगा?
धन्यवाद!
इन सभी धागे में से, उनमें से अधिकतर आमतौर पर अवरुद्ध हो जाएंगे। मुझे कनेक्शन प्रति 5 मिनट से अधिक होने की उम्मीद नहीं है। ग्राहक से आदेश कम से कम आते हैं, मैं औसतन 20 प्रति मिनट कहूंगा।
मैं यहां प्राप्त उत्तरों से जा रहा हूं (संदर्भ स्विचिंग प्रदर्शन हिट था जिसके बारे में मैं सोच रहा था, लेकिन मुझे नहीं पता था कि जब तक आप इसे इंगित नहीं करते, धन्यवाद!) मुझे लगता है कि मैं एक श्रोता, एक रिसीवर, एक प्रेषक, और कुछ विविध सामग्री के साथ दृष्टिकोण के लिए जाऊंगा ;-)
बकवास, एक नींद धागा में 1 एमबी स्टैक है, इसलिए 200 सोते धागे 200 एमबी बर्बाद स्मृति हैं। –
किसी गेम में 100 क्लाइंट प्रबंधित करने में सक्षम सर्वर में, शोर में 200 एमबी अपशिष्ट स्थान लगभग नीचे है। –
@ एरविकर - उद्धरण कृपया? –