2012-03-03 19 views
5

मेरे पास एक बहुत सी सीपीयू-गहन प्रसंस्करण कर रहा है, जो अन्य धागे को अवरुद्ध कर रहा है। मैं इसे कैसे सीमित करूं?मैं पाइथन धागे को कैसे थ्रोटल कर सकता हूं?

यह विशेष रूप से web2py के लिए है, लेकिन एक सामान्य समाधान ठीक होगा।

+3

यह असंभव है कि कैसे सीपीयू गहन गहराई से इसे अवरुद्ध कर देता है। अधिक संभावना है कि आप ग्लोबल इंटरप्रेटर लॉक (http://wiki.python.org/moin/GlobalInterpreterLock) के साथ समस्याओं में भाग ले रहे हैं। स्थिति को गधे लगाने के लिए आपको कुछ और जानकारी प्रदान करने की आवश्यकता होगी। आपके धागे क्या कर रहे हैं? – Wilduck

+1

सीपीयू गहन धागा @Wilduck आईओ विलंबता (हालांकि बहुत कम है हाल ही में एक अजगर में) जोड़ सकते हैं, उदाहरण के लिए इस देखें: http://dabeaz.blogspot.com/2010/01/python-gil-visualized.html – Tobu

+0

@Wilduck थ्रेड वास्तव में जेएस में कोड कहते हैं। मैं जीआईएल (यदि यह पहले से नहीं है) को आजमाने और रिलीज करने का लुत्फ उठा रहा है, लेकिन इससे मुझे यह सुनिश्चित करने के लिए मजबूर किया जाएगा कि जेएस को किसी भी समय जीआईएल की आवश्यकता नहीं है ... मैं शायद इसे इस पल के लिए छोड़ दूंगा और एक कामकाज खोजने के लिए। – Chris

उत्तर

3

मैं वास्तव में अभी डाइविंग इस मामले की छानबीन लंबे समय तक नहीं पहले समाप्त हो गया है, तो आप अभ्यस्त धागा प्राथमिकता बदल सकेंगे लेकिन इस के आसपास तरीके हैं।

आपको समस्या पर थोड़ा सा पृष्ठभूमि देने के लिए, सीपीथन कार्यान्वयन सीपीयू बाउंड थ्रेड में ग्लोबल इंटरप्रेटर लॉक या जीआईएल जारी होने और अधिग्रहण के तरीके के कारण अन्य धागे भूखे हो सकते हैं। विचित्र रूप से पर्याप्त यह समस्या एक मल्टीकोर वातावरण में खराब हो गई है। इस मुद्दे पर वास्तव में विस्तृत विश्लेषण और प्रस्तुति David Beazley द्वारा की गई थी जिसे आप http://www.dabeaz.com/python/GIL.pdf पर पा सकते हैं। उनके पास कई ब्लॉग पोस्ट हैं जो अधिक जानकारी में जाते हैं। वे लंबे हैं लेकिन काफी आकर्षक हैं।

लघु संस्करण है कि सीपीयू बाध्य धागा विज्ञप्ति और गिल reacquires से पहले अन्य सूत्र यह हड़पने के लिए उठ जा सकता है। 90% से अधिक समय के लिए जीआईएल धारण करने वाले सीपीयू बाउंड थ्रेड में परिणाम।

कुछ ऐसे पैटर्न हैं जिनका उपयोग आप इस समस्या के आसपास काम करने के लिए कर सकते हैं। उदाहरण के लिए आप अपने सीपीयू बाध्य कार्यों को पूरी तरह से अलग प्रक्रिया में चला सकते हैं। यह ऑपरेटिंग सिस्टम शेड्यूलर को संसाधन साझा करने के लिए बहुत बेहतर प्रबंधन करने की अनुमति देगा और आपके वेब 2py धागे को चलाना जारी रखना चाहिए क्योंकि ऑपरेटिंग सिस्टम वास्तव में आईओ बाउंड थ्रेड को वरीयता उपचार देते हैं। इस तरह के मामलों के लिए multiprocessing लाइब्रेरी प्रदान की जाती है। इसे काम करने के लिए इसे और अधिक कोड की आवश्यकता होगी लेकिन इससे मदद मिलनी चाहिए।

+0

मल्टीप्रोसेसिंग एक संभावित विकल्प की तरह दिखता है, धन्यवाद @ विलियम - – Chris

1

पाइथन का कौन सा संस्करण आप उपयोग कर रहे हैं? 3.2 में, the GIL was changed to yield after fixed timeslices rather than after a certain number of high-level opcodes

यहां तक ​​कि परिवर्तन के साथ

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

+0

मुझे लगता है कि नया जीआईएल केवल 3.2 में है। वे वास्तव में 3.3 में आगे बढ़ने पर काम कर रहे हैं http://bugs.python.org/issue7946 दुर्भाग्यवश वेब ढांचे में पाइथन 3 समर्थन केवल काम करना शुरू हो रहा है। मैंने अभी तक एक स्थिर व्यक्ति के बारे में नहीं सुना है। – William

+0

@ विलियम धन्यवाद, सही। [निडर आत्माओं को यहां एक बैकपोर्ट मिलेगा।] (Http://bugs.python.org/issue7753) – Tobu

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