2013-03-25 6 views
19

मैं अभी पाइथन gevent के साथ शुरू किया गया है और मैं लाइब्रेरी के cpu/mulitcore उपयोग के बारे में सोच रहा था।गीवेंट मल्टीकोर उपयोग

कुछ उदाहरणों को बंदरगाह वाले urllib के माध्यम से कई अनुरोध करने का प्रयास करते हुए मैंने देखा कि वे 99% लोड का उपयोग कर केवल एक कोर पर चल रहे थे।

मैं अजगर के साथ सभी कोर का उपयोग पायथन का उपयोग करके कैसे कर सकता हूं? क्या कोई अच्छा अभ्यास है? या क्या कई प्रक्रियाओं और gevent का उपयोग कर कोई दुष्प्रभाव हैं?

बीआर दान

उत्तर

47

Gevent आप अवरुद्ध अनुरोध के साथ सौदा करने की क्षमता देता है। यह आपको बहु-कोर पर चलाने की क्षमता नहीं देता है।

किसी भी समय एक अजगर प्रक्रिया में चलने वाला केवल एक ही ग्रीनलेट (गीवेंट का कोरआउट) है। भूगर्भ का वास्तविक लाभ यह है कि यह बहुत शक्तिशाली है जब यह आई/ओ बाधाओं से संबंधित होता है (जो आमतौर पर सामान्य वेब ऐप्स के मामले में होता है, एपीआई एंडपॉइंट्स, वेब-आधारित चैट ऐप्स या बैकएंड की सेवा करने वाले वेब ऐप्स और सामान्य रूप से, नेटवर्क किए गए ऐप्स)। जब हम कुछ सीपीयू-भारी गणना करते हैं, तो कोई गीवेन्ट का उपयोग करने से प्रदर्शन-लाभ होगा। जब कोई ऐप I/O बाध्य होता है, तो गीवेंट शुद्ध जादू होता है। या Greenlets दूर बंद हो जब भी एक आई/ओ आपरेशन को ब्लॉक कर देगा (जैसे के साथ gevent.sleep())

निर्मित अजगर धागे वास्तव में आप स्विच को स्पष्ट रूप से करते हैं जब:

एक सरल नियम नहीं है गीवेंट के हरितलेट के रूप में एक ही (छद्म) "समवर्ती" तरीके से व्यवहार करें।

मुख्य अंतर यह है - हरितलेट सहकारी मल्टीटास्किंग का उपयोग करते हैं, जहां धागे प्रीपेप्टिव मल्टीटास्किंग का उपयोग करते हैं। इसका अर्थ यह है कि एक ग्रीनलेट कभी भी निष्पादन को रोक नहीं पाएगा और किसी अन्य ग्रीनलेट को "उपज" नहीं करेगा जब तक कि यह कुछ "उपज" कार्यों का उपयोग नहीं करता (जैसे gevent.socket.socket.recv या gevent.sleep)।

दूसरी तरफ थ्रेड, अन्य थ्रेड (कभी-कभी अप्रत्याशित रूप से) पर निर्भर करेगा जब ऑपरेटिंग सिस्टम उन्हें स्वैप करने का निर्णय लेता है।

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

मैंने यहां एक बहुत लंबा स्पष्टीकरण लिखा - http://learn-gevent-socketio.readthedocs.org/en/latest/। यदि आप विवरण में गोता लगाने की देखभाल करते हैं। :- डी

+2

मैं जोड़ सकता हूं कि मामले के आधार पर, गीवेंट के साथ कई पायथन प्रक्रियाएं चलाना एक अच्छा समाधान हो सकता है। बेशक यह एक विकल्प नहीं है यदि प्रक्रियाओं को एक दूसरे के साथ एक महत्वपूर्ण राशि में संवाद करने की आवश्यकता हो। – ferrix

+0

उत्तर के लिए धन्यवाद। मैं चाहता हूं कि मशीन पर जितना संभव हो उतना I/O संचालन करना है। सवाल यह है: क्या मैं एन प्रक्रियाओं (धागे नहीं) का उपयोग करके अधिक अनुरोध करने में सक्षम हूं जहां n = cpu_cores या एक प्रक्रिया के साथ gevent जितना तेज़ हो सकता है? – thesonix

+1

यहां बताया गया है कि कैसे trunk.ly (एलेक्स दांग के शब्दों में) एक आई/ओ-बाउंड और सीपीयू-बाध्य समस्या के साथ निपटाया जाता है (वे साइट क्रॉल करते हैं और फिर खोज अनुक्रमणिका में क्रॉल की गई सामग्री डालते हैं) - https://groups.google .com/d/msg/gevent/4hR1P6Vd-uk/4A4bw5ynuucJ –

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