2009-06-23 21 views
8

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

असल में, एप्लिकेशन कई कार्यकर्ता धागे शुरू करता है, फिर उन्हें डेटा खिलाता है। प्रत्येक थ्रेड प्लगइन को किसी आइटम के लिए उपयोग करने के लिए निर्धारित करता है और आइटम को संसाधित करने के लिए कहता है। एक प्लग-इन एक विशिष्ट फ़ंक्शन परिभाषित एक पायथन मॉड्यूल है। प्रसंस्करण में आमतौर पर नियमित अभिव्यक्ति शामिल होती है, और इसे एक या उससे अधिक समय नहीं लेना चाहिए।

कभी-कभी, प्लगइन में से एक को मिनट पूरा करने के लिए, पूरे समय के लिए CPU पर 100% पर pegging ले जाएगा। यह आम तौर पर उस डेटा आइटम के साथ जोड़ा गया उप-इष्टतम नियमित अभिव्यक्ति के कारण होता है जो उस अक्षमता का खुलासा करता है।

यह वह जगह है जहां चीजें मुश्किल हो जाती हैं। अगर मुझे दोषी है कि अपराधी कौन है, तो मैं इसके कोड की जांच कर सकता हूं और समस्या ढूंढ सकता हूं। हालांकि, कभी-कभी मैं बहुत भाग्यशाली नहीं हूं।

  • मैं सिंगल थ्रेडेड नहीं जा सकता। यदि मैं करता हूं तो समस्या को दोबारा उत्पन्न करने के लिए यह शायद सप्ताह ले जाएगा।
  • प्लगइन पर एक टाइमर डालने से मदद नहीं मिलती है, क्योंकि जब यह जम जाता है तो यह जीआईएल लेता है, और अन्य सभी प्लगइन को पूरा करने में कुछ मिनट लगते हैं।
  • (यदि आप सोच रहे थे, SRE engine doesn't release the GIL)।
  • जहां तक ​​मैं profiling बता सकता हूं, मल्टीथ्रेडिंग के दौरान बहुत बेकार है।

मल्टीप्रोसेसिंग में पूरे आर्किटेक्चर को फिर से लिखने का छोटा, किसी भी तरह से मैं यह पता लगा सकता हूं कि मेरे सभी सीपीयू कौन खा रहे हैं?

जोड़ा: जवाब में कुछ टिप्पणियों के लिए:

  1. क्योंकि प्रोफाइलर कुल समारोह समय का है और सक्रिय नहीं CPU समय उपयोगी नहीं है अजगर में बहु कोड रूपरेखा। मेरा मतलब क्या है इसका देखने के लिए cProfile.run ('time.sleep (3)') आज़माएं। (rog पर क्रेडिट [अंतिम टिप्पणी])।

  2. सिंगल थ्रेडेड जाने का कारण मुश्किल है क्योंकि 20,000 में केवल 1 आइटम समस्या पैदा कर रहा है, और मुझे नहीं पता कि यह कौन सा है। मल्टीथ्रेड चलाने से मुझे लगभग एक घंटे में 20,000 आइटमों से गुज़रने की अनुमति मिलती है, जबकि सिंगल थ्रेडेड में अधिक समय लग सकता है (इसमें बहुत सारी नेटवर्क विलंबता शामिल है)। कुछ और जटिलताओं हैं जिन्हें मैं अभी नहीं लेना चाहता हूं।

जिसके अनुसार, यह नहीं एक बुरा विचार विशिष्ट कोड है कि प्लग इन कॉल क्रमानुसार करने की कोशिश है, इसलिए एक की कि समय दूसरों के समय को प्रभावित नहीं होंगे। मैं कोशिश करूँगा और वापस रिपोर्ट करूंगा।

+0

बहुभाषी द्वारा प्रोफाइलिंग जानकारी का कौन सा हिस्सा गड़बड़ हो रहा है? –

+0

क्या आप कृपया बता सकते हैं कि सिंगल-थ्रेडेड क्यों काम नहीं करेगा? यदि प्लग-इन किसी भी तरह से जीआईएल को कभी भी जारी नहीं करते हैं, तो आपके पास कोई समांतर प्रसंस्करण नहीं होगी और इसे बहु-थ्रेड किए जाने में मदद नहीं होगी। –

+1

"मैं सिंगल थ्रेडेड नहीं जा सकता। अगर मैं ऐसा करता हूं तो समस्या को पुन: पेश करने में शायद सप्ताह लगेंगे"; गलत। शायद सिंगल थ्रेडेड होने पर आपको थ्रेड की तुलना में तेजी से परिणाम मिलेगा। – nosklo

उत्तर

0

जैसा कि आपने कहा था, जीआईएल की वजह से यह एक ही प्रक्रिया में असंभव है।

मैं दूसरी मॉनिटर प्रक्रिया शुरू करने की अनुशंसा करता हूं, जो आपके मूल ऐप में किसी अन्य धागे से जीवन धड़कता है। एक बार उस समय बीट के लिए निर्दिष्ट समय के लिए गायब हो जाने पर, मॉनिटर आपके ऐप को मार सकता है और इसे पुनरारंभ कर सकता है।

+0

मैं पहले से ही ऐसा कर रहा हूं, लेकिन यह वास्तव में कोई समाधान नहीं है – itsadok

0

यदि सुझाव होगा कि आपके पास ढांचे पर नियंत्रण है, तो सभी एक प्लगइन को अक्षम करें और देखें। आप मूल रूप से यदि P1, P2 ... Pn प्लगइन्स रन एन प्रक्रिया और पहली में अक्षम P1, P2 दूसरे में और इतने पर

यह बहुत तेजी से होगा अपने बहु रन की तुलना में, के रूप में कोई जीआईएल अवरुद्ध और आपको जल्द ही पता चलेगा कि कौन सा प्लगइन अपराधी है।

3

आप जाहिरा तौर पर, क्योंकि आपके धागे किसी भी राज्य का हिस्सा नहीं है बहु सूत्रण, केवल संगामिति की जरूरत नहीं है:

बजाय बहु

एकल धागा/एन subprocesses multithreading का प्रयास करें। वहां आप प्रत्येक अनुरोध का समय ले सकते हैं, क्योंकि कोई भी जीआईएल नहीं है।

अन्य संभावना कई निष्पादन धागे से छुटकारा और घटना आधारित नेटवर्क प्रोग्रामिंग का उपयोग (यानी मुड़ का उपयोग करें)

+0

मल्टीप्रोसेसिंग का दूसरा लाभ यह है कि आप प्रक्रिया को 'देखने' में सक्षम होंगे, और पिड प्राप्त करेंगे। – monkut

0

मैं अभी भी nosklo के सुझाव पर ध्यान चाहते हैं पाने के लिए है। आइटम को ढूंढने के लिए आप एक थ्रेड पर प्रोफाइल कर सकते हैं, और अपने लंबे समय तक डंप प्राप्त कर सकते हैं, संभवतः अपराधी को देख सकते हैं। हाँ, मुझे पता है कि यह 20,000 आइटम है और इसमें काफी समय लगेगा, लेकिन कभी-कभी आपको इसे चूसना पड़ता है और खुद को समझाने के लिए धुन की बात मिलती है कि समस्या पकड़ी जाती है और उसका ख्याल रखा जाता है। स्क्रिप्ट चलाएं, और कुछ और रचनात्मक पर काम करें। वापस आएं और परिणामों का विश्लेषण करें। यही कारण है कि पुरुषों को कभी-कभी लड़कों से अलग करता है ;-)

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

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