2009-03-11 9 views
9

मैं हाल ही में this document पढ़ रहा था जिसमें सॉकेट सर्वर को लागू करने के लिए नियोजित कई रणनीतियों की सूची दी गई है। अर्थात्, वे हैं:पायथन में सॉकेट-आधारित सर्वर लिखने, अनुशंसित रणनीतियों?

  1. प्रत्येक थ्रेड के साथ कई ग्राहकों की सेवा, और nonblocking आई/ओ और स्तर ट्रिगर तत्परता अधिसूचना का प्रयोग
  2. प्रत्येक थ्रेड के साथ कई ग्राहकों की सेवा, और nonblocking आई/ओ और तत्परता परिवर्तन सूचना का उपयोग
  3. प्रत्येक सर्वर धागे से कई ग्राहकों की सेवा, और प्रयोग अतुल्यकालिक मैं/हे
  4. प्रत्येक सर्वर धागे से एक ग्राहक सेवा, और अवरुद्ध I/O
  5. का उपयोग गिरी
में सर्वर कोड का निर्माण

अब, मैं एक संकेत की सराहना करता हूं जिस पर का उपयोग सीपीथॉन में किया जाना चाहिए, जिसे हम जानते हैं कि कुछ अच्छे अंक हैं, और कुछ बुरे बिंदु हैं। मैं अधिकतर उच्च सहमति के तहत प्रदर्शन में रूचि रखता हूं, और हां, वर्तमान में कई कार्यान्वयन बहुत धीमे हैं।

तो यदि मैं आसान से शुरू कर सकता हूं, तो "5" बाहर है, क्योंकि मैं कर्नेल में कुछ भी हैकिंग नहीं कर रहा हूं।

"4" ऐसा लगता है कि यह जीआईएल के कारण बाहर होना चाहिए। बेशक, आप थ्रेड के स्थान पर मल्टीप्रोसेसिंग का उपयोग कर सकते हैं, और इससे महत्वपूर्ण बढ़ावा मिलता है। आईओ को अवरुद्ध करने के लिए समझने में आसान होने का लाभ भी है।

"1" पारंपरिक का चयन करें या चुनाव जो trivially बहु के साथ जोड़ा जा सकता है:

और यहाँ मेरी जानकारी एक सा क्षीण हो जाती है।

"2" तत्परता-परिवर्तन सूचना, नए epoll द्वारा इस्तेमाल किया और kqueue है

"3" मुझे यकीन है कि है कि अजगर रैपर इस के लिए किसी भी गिरी कार्यान्वयन देखते हैं नहीं कर रहा हूँ।

तो, पायथन में हमारे पास ट्विस्ट जैसे महान उपकरण हैं। शायद वे एक बेहतर दृष्टिकोण हैं, हालांकि मैंने ट्विस्टेड बेंचमार्क किया है और इसे एकाधिक प्रोसेसर मशीन पर बहुत धीमा पाया है। शायद लोड बैलेंसर वाले 4 मोड़ होने से यह हो सकता है, मुझे नहीं पता। किसी भी सलाह की सराहना की जाएगी।

उत्तर

7

asyncore मूल रूप से "1" है - यह आंतरिक रूप से select का उपयोग करता है, और आपके पास केवल एक थ्रेड हैं जो सभी अनुरोधों को संभालने में सक्षम है। दस्तावेज़ों के अनुसार यह poll का भी उपयोग कर सकता है। (संपादित करें: हटाए गए संदर्भ को हटा दिया, मैंने सोचा कि यह एसिंकोर का इस्तेमाल करता है, लेकिन मैं गलत था)।

"2" python-epoll के साथ लागू किया जा सकता है (बस इसे गुगल किया - इसे पहले कभी नहीं देखा)। संपादित करें: (टिप्पणियों से) पायथन 2 में।6 select module में एपोल, क्यूक्यू और केवेन्ट बिल्ड-इन (समर्थित प्लेटफार्मों पर) है। तो आपको एज-ट्रिगर सेवा देने के लिए किसी बाहरी पुस्तकालय की आवश्यकता नहीं है।

"4" से इंकार न करें, क्योंकि जब थ्रेड वास्तव में कर रहा है या आईओ-ऑपरेशंस (संभवतः अधिकांश समय) के लिए प्रतीक्षा कर रहा है तो जीआईएल गिरा दिया जाएगा। अगर आपको पाठ्यक्रम की बड़ी संख्या में कनेक्शन मिलते हैं तो यह समझ में नहीं आता है। यदि आपके पास बहुत सारी प्रक्रियाएं हैं, तो इन योजनाओं में से किसी के साथ पाइथन समझ में नहीं आ सकता है।

लचीलापन के लिए शायद Twisted देखें?

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

+0

कहा था कि मुझे लगता है कि एपॉल 2.6+ में stdlib में है, और 2.5 के लिए easy_installable है। पैकेज को चुनिंदा-कुछ कहा जाता है। अस्पष्टता के लिए खेद है। –

+0

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

+0

यह 'asyncore' – new123456

1

http://docs.python.org/library/socketserver.html#asynchronous-mixins

मल्टी-प्रोसेसर (मल्टी कोर) मशीनों के लिए के रूप में। GIL के कारण सीपीथॉन के साथ आपको स्केल करने के लिए प्रति कोर कम से कम एक प्रक्रिया की आवश्यकता होगी। जैसा कि आप कहते हैं कि आपको सीपीथन की आवश्यकता है, आप ForkingMixIn के साथ बेंचमार्क करने का प्रयास कर सकते हैं। लिनक्स 2.6 के साथ कुछ दिलचस्प परिणाम दे सकते हैं।

अन्य तरीका Stackless Python का उपयोग करना है। वह how EVE solved it है। लेकिन मैं समझता हूं कि यह हमेशा संभव नहीं है।

+0

धन्यवाद, लेकिन आप उन चीजों बेंचमार्क है? वे धीमे हैं। अगर मुझे ऐसा नहीं करना पड़ेगा तो मैं पहिया का आविष्कार नहीं करूंगा। –

+0

+1 स्टैकलेस/ईवीई, लेकिन मैंने सीपीथन –

1

मैं डगलस 'जवाब पसंद है, लेकिन एक अलग रूप में ...

आप एक केंद्रीकृत प्रेषण धागा/प्रक्रिया है कि तत्परता सूचनाओं के लिए सुनता कार्यकर्ता धागे का एक पूल के लिए select और प्रतिनिधियों का उपयोग कर के रूप में इस्तेमाल कर सकते हैं/processes पूरा करने में मदद करने के लिए आपके समांतरता लक्ष्यों।

जैसा कि डगलस ने उल्लेख किया है, हालांकि, जीआईएल सबसे लंबे समय तक I/O संचालन के दौरान नहीं आयोजित किया जाएगा (चूंकि कोई पायथन-एपीआई चीजें नहीं हो रही हैं), इसलिए यदि यह प्रतिक्रिया विलंबता है तो आप चिंतित हैं कि आप आगे बढ़ने का प्रयास कर सकते हैं सीपीथॉन एपीआई में आपके कोड के महत्वपूर्ण भाग।

2

क्या मैं अतिरिक्त लिंक सुझा सकता हूं?

cogen नेटवर्क उन्मुख, कोरआउटिन प्रोग्रामिंग के लिए एक क्रॉसप्लेटफार्म लाइब्रेरी है जो पायथन 2.5 से उन्नत जनरेटर का उपयोग कर नेटवर्क आधारित है। कोोजेन प्रोजेक्ट के मुख्य पृष्ठ पर इसी तरह के उद्देश्य से कई परियोजनाओं के लिंक हैं।

3

"कांटा" के बारे में कैसे? (मुझे लगता है कि फोर्किंगमिक्सइन करता है) यदि अनुरोधों को "साझा कुछ नहीं" (डीबी या फाइल सिस्टम के अलावा) आर्किटेक्चर में संभाला जाता है, तो फोर्क() अधिकांश * निक्स पर बहुत तेज़ी से शुरू होता है, और आपको चिंता करने की ज़रूरत नहीं है थ्रेडिंग से सभी मूर्खतापूर्ण बग और जटिलताओं के बारे में।

थ्रेड एक डिजाइन बीमारी है जो ओएसई द्वारा भारी वजन वाली प्रक्रियाओं, आईएमएचओ के साथ हमारे लिए मजबूर होती है। कॉपी-ऑन-राइट विशेषताओं वाले पृष्ठ तालिका को क्लोन करना एक छोटी सी कीमत है, खासकर यदि आप किसी दुभाषिया को चला रहे हैं।

खेद है कि मैं और अधिक विशिष्ट नहीं किया जा सकता है, लेकिन मैं एक पर्ल-संक्रमण करने वाली रूबी प्रोग्रामर के और अधिक कर रहा हूँ


अद्यतन (जब मैं काम पर जावा की जनता पर slaving नहीं कर रहा हूँ) : आखिर में मैंने अपने "खाली समय" में थ्रेड बनाम कांटा पर कुछ समय लगाया। इसे देखें:

http://roboprogs.com/devel/2009.04.html

विस्तारित: http://roboprogs.com/devel/2009.12.html

+0

इसके अलावा, आप अन्य मॉड्यूल के लिए कोड खींच सकते हैं जो आप जानते हैं कि आप बच्चे की प्रक्रिया शुरू करने से पहले उपयोग करेंगे। इससे उन्हें टोकननाइज्ड (जेआईटी-एड, जो भी हो) होने से रोक दिया जाएगा। दूसरा, माता-पिता को छोटे से डेटा में रखें, सुपर कचरा कलेक्टर के रूप में "बाहर निकलें" का उपयोग करें। – Roboprog

3

एक sollution gevent है। Gevent ग्रीनलेट द्वारा लागू हल्के सहकारी कार्य स्विचिंग के साथ एक libevent आधारित घटना मतदान maries।

आपको जो भी मिलता है वह आईओ प्रोग्रामिंग को अवरुद्ध करने के लालित्य और सीधा मॉडल के साथ एक ईवेंट सिस्टम के सभी प्रदर्शन और स्केलेबिलिटी है।

(मैं क्या अतः पुराने सवाल वास्तव में करने के लिए जवाब देने के बारे में सम्मेलन है पता नहीं, लेकिन फैसला किया मैं अभी भी अपने 2 सेंट जोड़ना चाहते हैं)

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