2008-08-29 29 views
22

एक विश्वसनीय कोडर मित्र ने मुझे बताया कि पायथन का वर्तमान बहु-थ्रेडिंग कार्यान्वयन गंभीरता से खराब है - पूरी तरह से उपयोग करने से बचने के लिए पर्याप्त है। इस अफवाह के बारे में क्या कहा जा सकता है?पाइथन धागे छोटी गाड़ी हैं?

+2

पाइथन में जीआईएल के संबंध में डेविड बेज़ली द्वारा नई प्रस्तुति: http://blip.tv/file/2232410 – guns

उत्तर

48

पायथन धागे समवर्ती I/O प्रोग्रामिंग के लिए अच्छे हैं। जैसे ही वे फ़ाइल, नेटवर्क इत्यादि से इनपुट के लिए इंतजार कर रहे हैं, थ्रेड को सीपीयू से बाहर कर दिया जाता है। यह अन्य पायथन धागे को CPU का उपयोग करने की अनुमति देता है जबकि अन्य प्रतीक्षा करते हैं। यह आपको उदाहरण के लिए एक बहु थ्रेडेड वेब सर्वर या वेब क्रॉलर लिखने की अनुमति देगा।

हालांकि, जब वे दुभाषिया कोर में प्रवेश करते हैं तो पाइथन धागे GIL द्वारा क्रमबद्ध होते हैं। इसका मतलब यह है कि यदि दो धागे संख्याओं को कम कर रहे हैं, तो केवल किसी भी क्षण किसी भी व्यक्ति को चलाया जा सकता है। इसका मतलब यह भी है कि आप बहु-कोर या बहु-प्रोसेसर आर्किटेक्चर का लाभ नहीं उठा सकते हैं।

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

+10

आजकल समाधान मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करना है। – nosklo

+1

पायथन धागे निश्चित रूप से असली सीपीयू धागे हैं। – zweiterlinde

+9

मुझे नहीं पता कि "सीपीयू थ्रेड्स" का क्या अर्थ है, लेकिन पायथन धागे * ओएस धागे हैं। – tzot

-2

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

3

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

this देखें कि क्यों कुछ व्यावहारिक विस्तार और कामकाज के लिए सीपीथन कार्यान्वयन से जीआईएल को हटाने और this को वास्तव में संभव नहीं है।

अधिक जानकारी के लिए "Python GIL" के लिए त्वरित Google करें।

+0

मुझे नहीं पता कि मैं कहूंगा कि पाइथन का थ्रेडिंग अक्षम है या नहीं। यह सिर्फ इतना है कि आप मल्टीकोर मशीनों का लाभ नहीं उठा सकते हैं। –

+1

मैं करता हूं, और यह बात मेरे साथ सहमत होती है, और पर्याप्त उदाहरण प्रदान करती है: http://blip.tv/file/2232410 ज्यादातर मामलों में इससे कोई फर्क नहीं पड़ता। फिर भी, बात देखें, यह बहुत अच्छा है! –

8

जीआईएल (ग्लोबल इंटरप्रेटर लॉक) एक समस्या हो सकती है, लेकिन एपीआई काफी ठीक है। उत्कृष्ट processing मॉड्यूल का प्रयास करें, जो अलग प्रक्रियाओं के लिए थ्रेडिंग एपीआई लागू करता है। मैं अभी इसका उपयोग कर रहा हूं (हालांकि ओएस एक्स पर, अभी तक विंडोज़ पर कुछ परीक्षण नहीं करना है) और वास्तव में प्रभावित हूं। जटिलता प्रबंधन के मामले में कतार वर्ग वास्तव में मेरे बेकन को बचा रहा है!

संपादित: यह प्रसंस्करण मॉड्यूल संस्करण 2.6 (import multiprocessing) के रूप में मानक लाइब्रेरी में शामिल किया जा रहा है seemes। जोय!

14

पाइथन (आमतौर पर सीपी में लिखा गया सीपीथॉन के रूप में जाना जाता है) के मानक कार्यान्वयन ओएस धागे का उपयोग करता है, लेकिन चूंकि Global Interpreter Lock है, इसलिए एक समय में केवल एक थ्रेड को पायथन कोड चलाने की अनुमति है। लेकिन उन सीमाओं के भीतर, थ्रेडिंग पुस्तकालय मजबूत और व्यापक रूप से उपयोग किए जाते हैं।

यदि आप एकाधिक CPU कोर का उपयोग करने में सक्षम होना चाहते हैं, तो कुछ विकल्प हैं। एक दूसरे के द्वारा उल्लिखित एक साथ कई पायथन दुभाषियों का उपयोग करना है। एक और विकल्प पायथन के एक अलग कार्यान्वयन का उपयोग करना है जो जीआईएल का उपयोग नहीं करता है। दो मुख्य विकल्प Jython और IronPython हैं।

जैथन जावा में लिखा गया है, और अब काफी परिपक्व है, हालांकि कुछ असंगतताएं बनी हुई हैं। उदाहरण के लिए, वेब फ्रेमवर्क Django does not run perfectly yet, लेकिन हर समय करीब आ रहा है। Jython great for thread safety है, better in benchmarks से बाहर आता है और इसमें cheeky message for those wanting the GIL है।

आयरनपीथन .NET ढांचे का उपयोग करता है और सी # में लिखा गया है। संगतता उस चरण तक पहुंच रही है जहां Django can run on IronPython (कम से कम एक डेमो के रूप में) और guides to using threads in IronPython हैं।

+5

सीपीथन ग्रीन थ्रेड का उपयोग नहीं करता है। यह देशी ओएस धागे का उपयोग करता है, लेकिन ग्लोबल इंटरप्रेटर लॉक का अर्थ है कि वे हरे धागे के समान तरीके से व्यवहार करते हैं (क्योंकि एक समय में केवल एक धागा चल सकता है)। –

+0

सेकेंडेड। सीपीथन हरे धागे का उपयोग नहीं करता है। –

1

यदि आप पाइथन में कोड करना चाहते हैं और महान थ्रेडिंग समर्थन प्राप्त करना चाहते हैं, तो आप आयरनपीथन या ज्योथन को देखना चाहेंगे। चूंकि आयरनपीथन और जेथन में पाइथन कोड क्रमशः .NET CLR और Java VM पर चलता है, इसलिए वे उन पुस्तकालयों में निर्मित महान थ्रेडिंग समर्थन का आनंद लेते हैं। इसके अलावा, आयरनपीथन में जीआईएल नहीं है, यह एक मुद्दा है जो सीपीथन थ्रेड को बहु-कोर आर्किटेक्चर का पूर्ण लाभ लेने से रोकता है।

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