नहीं, यह अंतर्निहित सी सॉकेट (और उस मामले के लिए टीसीपी/आईपी प्रोटोकॉल) की सीमा है। मेरा सवाल यह है कि: जब आप अपने आवेदन को आर्किटेक्ट करने के लिए आर्किटेक्ट कर सकते हैं तो आप उन्हें क्यों बंद कर रहे हैं?
कई शॉर्ट-टर्म सॉकेट के साथ समस्या यह है कि उन्हें बंद करने से उन्हें एक ऐसे राज्य में रखा जाता है जहां उन्हें थोड़ी देर के लिए उपयोग नहीं किया जा सकता है (मूल रूप से, दो बार पैकेट जीवनकाल, यह सुनिश्चित करने के लिए कि नेटवर्क में किसी भी पैकेट आते हैं और छोड़ दिए जाते हैं , या नेटवर्क से खुद को छोड़ दिया)। असल में क्या होता है कि, 4-टुपल में अद्वितीय होने की आवश्यकता होती है (स्रोत आईपी, स्रोत पोर्ट, गंतव्य आईपी, गंतव्य पोर्ट), पहला और आखिरी दो हमेशा एक जैसा होता है, जब आप स्रोत से बाहर निकलते हैं बंदरगाहों, आप होस कर रहे हैं।
हमने इस समस्या को सॉफ़्टवेयर में मारा है इससे पहले कि जब हम तेजी से मशीनों पर दौड़ते थे तो यह केवल स्पष्ट हो गया था (क्योंकि हम कई और सत्रों का उपयोग कर सकते थे)।
क्यों आप सिर्फ सॉकेट खोलते हैं और इसका उपयोग जारी रखते हैं? ऐसा लगता है कि आपका प्रोटोकॉल एक साधारण अनुरोध/प्रतिक्रिया एक है, जिसे उस दृष्टिकोण के साथ आसानी से सक्षम किया जाना चाहिए।
कुछ की तरह:
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((adr, prt)
for i in range(nb):
sck.send('question %i'%i)
answer=sck.recv(4096)
print 'answer %i : %s' % (%i, answer)
sck.close()
अद्यतन:
एक संभावना यह (और हम किया है इस से पहले) यदि आप इस नित्य खुला होने के कारण कनेक्शन से बाहर चला रहे हैं/बंद, है समस्या का पता लगाने और इसे थ्रॉटल करने के लिए। निम्नलिखित कोड पर विचार करें (सामान मैं जोड़ दिया है के बाद से मैं काफी कुछ समय के लिए अजगर छुआ है अजगर की तुलना में अधिक छद्म कोड है):
for i in range(nb):
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((adr, prt)
while sck.error() == NO_SOCKETS_AVAIL:
sleep 250 milliseconds
sck.connect((adr, prt)
sck.send('question %i'%i)
sck.shutdown(SHUT_WR)
answer=sck.recv(4096)
print 'answer %i : %s' % (%i, answer)
sck.close()
असल में, यह आप पूरी रफ्तार से चलाने के देखते हैं, जबकि सुविधा देता है बहुत सारे संसाधन लेकिन जब आप अपनी समस्या क्षेत्र पर हमला करते हैं तो धीमा हो जाता है। वास्तव में संसाधनों के कम होने पर असफल होने की समस्या को "ठीक करने" के लिए हमने अपने उत्पाद के साथ क्या किया है। हम इस तथ्य को छोड़कर फिर से वास्तुकार कर चुके थे कि यह जीवन के अंत में एक विरासत उत्पाद था और हम मूल रूप से सेवा के लिए निश्चित-लागत-लागत मोड में थे।
मेरी इच्छा है कि मैं ऐसा कर सकूं, लेकिन दुर्भाग्यवश मुझे सॉकेट को बंद करना होगा (या कम से कम "आधे बंद करें") अन्यथा कॉल कॉल ब्लॉक भेजें और मुझे कभी जवाब नहीं मिलेगा। मुझे लगता है कि अगर मैं सॉकेट को बंद नहीं करता हूं, तो सर्वर नहीं जानता कि मैं डेटा भेज रहा हूं और कुछ और इंतजार कर रहा हूं। – dugres
डेटा स्ट्रीम में डिलीमीटरों (उदाहरण के लिए) के आधार पर आपको अधिक "समझदार" दृष्टिकोण का उपयोग करने के लिए सर्वर को फिर से लिखना होगा। लेकिन एक और संभावना है - समस्या को हल करने के लिए हमने जो दृष्टिकोण लिया है, उसके लिए मेरा अपडेट देखें। – paxdiablo
@ पैक्स: मैंने आपका समाधान लागू किया है और यह किसी भी "एनबी" के लिए बहुत अच्छा काम करता है। आपका बहुत बहुत धन्यवाद। – dugres