2011-11-29 14 views
7

पायथन में, क्या यह पता लगाने का कोई तरीका है कि कौन सी सीपीयू एक प्रक्रिया चल रही है? उदाहरण के लिए यदि मैं मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करके अलग-अलग कार्यों के लिए अलग-अलग प्रक्रियाएं बनाता हूं, तो क्या यह प्रक्रिया उस कोर की पहचान करना संभव है जिसमें प्रत्येक प्रक्रिया चल रही है?पायथन मल्टीप्रोसेसर प्रोग्रामिंग

+1

प्रोग्राम या ओएस के माध्यम से? यदि ओएस, तो कौन सा ओएस? – jzila

+0

प्रोग्रामेटिक या ओएस द्वारा आपका क्या मतलब है? यदि आप प्रोग्राम के माध्यम से या बाहर से इसका मतलब है, तो मैं इसे प्रोग्राम के अंदर से चाहता हूं। उदाहरण के लिए, मैं os.getpid() के साथ प्रक्रिया आईडी प्राप्त कर सकता हूं, क्या मैं सीपीयू को ढूंढने के समान कुछ कर सकता हूं जो कि प्रक्रिया चल रही है। –

+0

बीटीडब्ल्यू। आप सीपीयू नंबर को पहले स्थान पर क्यों खोजना चाहते हैं? आप क्या हासिल करने का प्रयास कर रहे हैं? – jsalonen

उत्तर

1

मुझे नहीं लगता कि यह विश्वसनीय रूप से किया जा सकता है क्योंकि एक प्रक्रिया कोर तक ही सीमित नहीं है। एक प्रक्रिया एक या अधिक कोर (यदि यह धागे का उपयोग करती है) पर निष्पादित कर सकती है और इसे निष्पादित करने के लिए उपयोग किए जाने वाले कोर समय के साथ बदल सकते हैं क्योंकि ओएस वर्कलोड को संतुलित करने का प्रयास करता है।

प्रक्रिया से संबंधित जानकारी प्राप्त करने का एक अच्छा तरीका psutil लाइब्रेरी में देखें।

3

लघु जवाब

नहीं, यह संभव नहीं है।

लांग जवाब

एक सामान्य स्थिति में आप ऐसा नहीं कर सकते कि चूंकि प्रक्रियाओं विशिष्ट कोर करने के लिए बाध्य नहीं कर रहे हैं। प्रक्रियाओं में निश्चित CPU नहीं होते हैं जिन्हें वे हमेशा चलाने की गारंटी देते हैं: यह तय करने के लिए ऑपरेटिंग सिस्टम पर निर्भर करता है कि यह एक विशिष्ट समय पर एक विशिष्ट प्रक्रिया चलाने के लिए कौन सा कोर उपयोग करता है। इस निर्णय लेने को scheduling कहा जाता है और इसका कार्यान्वयन ओएस विशिष्ट है।

विशिष्ट ऑपरेटिंग सिस्टम पर, आप नियंत्रित करने में सक्षम हो सकते हैं, विशिष्ट प्रक्रियाओं के उत्तेजना के लिए प्रोसेसर का उपयोग कैसे किया जाता है। पसंदीदा प्रोसेसर का असाइनमेंट अक्सर processor affinity के रूप में जाना जाता है। यहां तक ​​कि affinitity सेटिंग भी गारंटी नहीं देता है कि दिए गए कोर पर एक प्रक्रिया हमेशा निष्पादित की जाएगी: यह अंततः ओएस (और सीपीयू) तक तय होता है कि शेड्यूलिंग को अंततः कैसे निष्पादित किया जाता है।

सभी ओएस से मुझे पता है कि सबसे नज़दीकी चीज जो मैं सोच सकता हूं वह लिनक्स का sched_getcpu होगा जिसका उपयोग "सीपीयू को निर्धारित करने के लिए किया जा सकता है जिस पर कॉलिंग थ्रेड चल रहा है" (man sched_getcpu देखें)। यहां तक ​​कि यह भी दिया गया है कि आप वर्तमान फ़ंक्शन को इस फ़ंक्शन के साथ जांचते हैं, कर्नेल कोर को बाद में बदल सकता है।

+1

मुझे नहीं पता कि प्रक्रिया एफ़िनिटी की सेटिंग और पूछताछ को संभालने के लिए क्रॉस-प्लेटफ़ॉर्म समाधान मौजूद है या नहीं। विंडोज़ पर आप [SetProcessAffinityMask] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686223%28v=vs.85%29 पर कॉल करके कोर के किसी विशेष सेट पर प्रक्रिया एफ़िनिटी सेट कर सकते हैं। एएसपीएक्स) थोड़ा वेक्टर के साथ। – eryksun

+0

मुझे नहीं लगता कि यह भी मौजूद है। पीईपीआई से मुझे 'एफ़िनिटी 0.1.0' (http://pypi.python.org/pypi/affinity) मिला, जो विंडोज और कुछ विशिष्ट लिनक्स कर्नेल पर एफ़िनिटी फ़ंक्शंस के लिए रैपर प्रदान करने के लिए कहता है।मैंने कोशिश नहीं की है और यहां तक ​​कि वह लाइब्रेरी दी गई समस्या को पूरा समाधान प्रदान नहीं करेगी, जो स्वयं गलत धारणा पर आधारित है कि प्रक्रिया विशिष्ट सीपीयू से बंधी हुई है। – jsalonen

+0

मुझे कारण नहीं दिख रहा है कि क्यों विशिष्ट CPUs से संसाधित नहीं होने वाली प्रक्रिया हमें उन सटीक समय अंतराल पर चलाने के लिए अनुमति नहीं देती है, जिन्हें वे विशिष्ट समय अंतराल पर चला रहे हैं। मैं क्यों नहीं देख सकता कि कौन सी सीपीयू मेरी प्रक्रिया चला रही है उदाहरण के लिए हर 10 सेकंड? –

3

अजगर ऐसी कार्यक्षमता अब हो सकता है नहीं है, लेकिन

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

संदर्भ: How could I know which core a process is running on?

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