2010-02-10 6 views
6

Apache mod_wsgi पर तैनात एक Django ऐप को विकसित करते समय मैंने पाया कि मल्टीथ्रेडिंग (पायथन थ्रेड, mod_wsgi प्रक्रिया = 1 थ्रेड = 8) के मामले में पाइथन सभी उपलब्ध प्रोसेसर का उपयोग नहीं करेगा। मल्टीप्रोसेसिंग दृष्टिकोण के साथ (mod_wsgi प्रक्रिया = 8 धागे = 1) सब ठीक है और मैं अपनी मशीन को पूरी तरह से लोड कर सकता हूं।क्या पाइथन थ्रेड मोड में सभी प्रोसेसर का उपयोग करेगा?

तो प्रश्न: क्या यह पायथन व्यवहार सामान्य है? मुझे शक है क्योंकि कुछ थ्रेड के साथ 1 प्रक्रिया का उपयोग डिफ़ॉल्ट mod_wsgi दृष्टिकोण है।

प्रणाली है: FreeBSD 7.2 AMD64 पर

2xIntel जिऑन 5xxx श्रृंखला (8 कोर (16 हाइपरथ्रेडिंग के साथ)) और 2.6.4


धन्यवाद सभी प्रश्नों के उत्तर के लिए अजगर। हम सभी ने पाया कि जीआईएल की वजह से यह व्यवहार सामान्य है। यहां एक अच्छा स्पष्टीकरण दिया गया है: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/ या स्टैक ओवरफ्लो जीआईएल चर्चा: ।

+1

इस प्रश्न के तीन अपवाद क्यों हैं? एक साधारण Google खोज पर्याप्त होगी। – aaronasterling

+0

@Aaronasterling: हम सरल प्रश्नों और सरल उत्तरों के साथ एक बड़ा ज्ञान डेटाबेस stackoverflow बनाना पसंद करते हैं। निश्चित रूप से यह जानकारी उपलब्ध है यदि आप STFG – HardQuestions

उत्तर

10

क्या पाइथन थ्रेड मोड में सभी प्रोसेसर का उपयोग करेगा? संख्या

पायथन सभी उपलब्ध प्रोसेसर का उपयोग नहीं करेगा; क्या यह पायथन व्यवहार सामान्य है? हां, जीआईएल की वजह से यह सामान्य है।

चर्चा के लिए http://mail.python.org/pipermail/python-3000/2007-May/007414.html देखें।

हो सकता है कि एक जोड़े को होने (या 4) प्रति कोर धागे की/प्रक्रिया अभी भी प्रदर्शन में सुधार कर सकते हैं अगर वहाँ कुछ अवरुद्ध है उदाहरण के डेटाबेस से प्रतिक्रिया की प्रतीक्षा करने के लिए, कि इस प्रक्रिया अन्यथा अन्य कनेक्शन ब्लॉक करने के लिए कारण होगा।

+0

आपके द्वारा किए गए अंतिम सुझाव को गैर-अवरुद्ध एकल थ्रेडेड दृष्टिकोण – nosklo

1

मुझे नहीं पता कि यह अभी भी मामला है, लेकिन पाइथन दुभाषिया में एक वैश्विक लॉक है, जो एक एकल दुभाषिया से सभी प्रोसेसर संसाधनों के उपयोग को रोकता है, यहां तक ​​कि बहु थ्रेडिंग का उपयोग करते समय भी। IIRC, वैश्विक लॉक I/O के साथ करना है।

ऐसा लगता है कि आप इस लॉक का परिणाम देख रहे हैं, इसलिए, व्यक्तिगत रूप से, मैं एक ही थ्रेड के साथ कई प्रक्रियाओं का उपयोग करूंगा।

4
  1. क्या पाइथन थ्रेड मोड में सभी प्रोसेसर का उपयोग करेगा? संख्या

  2. यह सामान्य है? हाँ, यह सामान्य है। पायथन आपके सभी कोरों को ढूंढने का कोई प्रयास नहीं करता है।

  3. "कुछ थ्रेड के साथ 1 प्रक्रिया डिफ़ॉल्ट mod_wsgi दृष्टिकोण है"। लेकिन यह इष्टतम या यहां तक ​​कि वांछनीय नहीं है। यह सिर्फ एक डिफ़ॉल्ट है। इसमें कुछ भी मत पढ़ो।

यदि आप अपने सभी कंप्यूटर के संसाधनों का उपयोग करना चाहते हैं, तो ओएस इसे संभाल लें। प्रक्रियाओं का प्रयोग करें।

बहु-प्रसंस्करण और बहु-थ्रेडिंग के बीच अंतर अधिकांश भाग के लिए मापना मुश्किल है। प्रक्रियाओं या धागे का उपयोग मुश्किल से मायने रखता है। प्रक्रियाओं का उपयोग करना आमतौर पर आसान होता है, क्योंकि इसके लिए छोटा ओएस समर्थन होता है।

बॉटम लाइन

कई प्रक्रियाओं का प्रयोग करें, ओएस (और अपाचे) प्रणाली के जितना संभव हो उतना उपयोग करने के लिए अनुमति देता है।

थ्रेड्स I/O संसाधनों के सीमित सेट को उस प्रक्रिया के लिए साझा करते हैं, जिसका वे हिस्सा हैं, और वेब पेज सेवारत I/O बाध्य है। प्रक्रियाओं में स्वतंत्र I/O संसाधन होते हैं और आपके प्रोसेसर को अधिक आसानी से निकाल देंगे।

+0

पर प्रदर्शन में सुधार नहीं कर सकते हैं, यह भी देखें: http://docs.python.org/library/multiprocessing.html – exhuma

1

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

तो एक पायथन प्रक्रिया केवल एक ही CPU पर कब्जा कर सकती है। बहु-कोर सिस्टम का पूरी तरह से उपयोग करने के लिए, आपको कई पायथन प्रक्रियाएं चलानी होंगी।

3

अभी भी आशा है। जीआईएल केवल आपके द्वारा python.org से डाउनलोड किए गए सी पायथन कार्यान्वयन का कार्यान्वयन कलाकृति है। ज्योथन और आयरनपीथन पाइथन के दो अन्य कार्यान्वयन हैं, और उनके पास कोई जीआईएल नहीं है, इसलिए आपके पास उनमें से एक के साथ बेहतर थ्रेडिंग परिणाम हो सकते हैं।

+1

सच है, लेकिन ओपी mod_wsgi के साथ ज्योथन या आयरनपीथन का उपयोग नहीं कर सकता है। –

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