सेटअपमेरी पाइथन प्रक्रियाओं पर कौन सी सीपीयू कोर चल रही हैं?
मैं एक बहुत जटिल (एक विंडोज पीसी पर) पायथन में सॉफ्टवेयर का टुकड़ा लिखा है। मेरा सॉफ्टवेयर मूल रूप से दो पायथन दुभाषिया गोले शुरू होता है। पहला शेल शुरू होता है (मुझे लगता है) जब आप main.py
फ़ाइल को डबल क्लिक करते हैं। कि खोल के भीतर, अन्य थ्रेड निम्नलिखित तरीके से शुरू कर रहे हैं:
# Start TCP_thread
TCP_thread = threading.Thread(name = 'TCP_loop', target = TCP_loop, args = (TCPsock,))
TCP_thread.start()
# Start UDP_thread
UDP_thread = threading.Thread(name = 'UDP_loop', target = UDP_loop, args = (UDPsock,))
TCP_thread.start()
Main_thread
एक TCP_thread
और एक UDP_thread
शुरू होता है। हालांकि ये अलग धागे हैं, वे सभी एक ही पायथन खोल के भीतर भागते हैं।
Main_thread
भी एक उपप्रजाति शुरू करता है। यह निम्नलिखित तरीके से किया जाता है:
p = subprocess.Popen(['python', mySubprocessPath], shell=True)
अजगर प्रलेखन से, मैं समझता हूँ कि इस उपप्रक्रिया एक साथ चल रहा है एक अलग अजगर दुभाषिया सत्र/खोल में (!)। इस सबप्रोसेस में Main_thread
पूरी तरह से मेरे जीयूआई को समर्पित है। जीयूआई अपने सभी संचारों के लिए TCP_thread
शुरू करता है।
मुझे पता है कि चीजें थोड़ा जटिल हो जाती हैं। इसलिए मैं इस आंकड़े में पूरे सेटअप संक्षेप है:
मैं इस स्थापना के विषय में कई प्रश्न हैं। मैं यहाँ उन्हें नीचे सूची जाएगा:
प्रश्न 1 [हल]
यह सही है कि एक अजगर दुभाषिया एक समय सभी धागे को चलाने के लिए केवल एक सीपीयू कोर का उपयोग करता है? दूसरे शब्दों में, Python interpreter session 1
(आकृति से) एक सीपीयू कोर पर सभी 3 धागे (Main_thread
, TCP_thread
और UDP_thread
) चलाएंगे?
उत्तर: हाँ, यह सच है। जीआईएल (ग्लोबल इंटरप्रेटर लॉक) यह सुनिश्चित करता है कि सभी थ्रेड एक समय में एक सीपीयू कोर पर चलते हैं।
प्रश्न 2 [अभी तक नहीं सुलझ]
मैं ट्रैक करने के लिए जो सीपीयू कोर यह है एक तरह से है?
प्रश्न 3
[आंशिक रूप से हल] इस सवाल हम के बारे में धागे भूल के लिए, लेकिन हम अजगर में उपप्रक्रिया तंत्र पर ध्यान केंद्रित। एक नया सबप्रोसेस शुरू करने से तात्पर्य एक नया पायथन दुभाषिया उदाहरण शुरू होता है। क्या ये सही है?
उत्तर: हाँ यह सही है।
p = subprocess.Popen(['python', mySubprocessPath], shell = True)
मुद्दा स्पष्ट कर दिया गया है सबसे पहले के बारे में है कि क्या निम्नलिखित कोड एक नया अजगर दुभाषिया उदाहरण बन जाएगा कुछ भ्रम की स्थिति थी। यह कोड वास्तव में एक नया पायथन दुभाषिया उदाहरण शुरू करता है।
क्या पाइथन एक अलग CPU कोर पर उस अलग पायथन दुभाषिया उदाहरण को चलाने के लिए पर्याप्त स्मार्ट होगा? क्या किसी को ट्रैक करने का कोई तरीका है, शायद कुछ स्पोरैडिक प्रिंट स्टेटमेंट्स के साथ भी?
प्रश्न 4 [नए सवाल]
समुदाय चर्चा एक नया सवाल उठाया। वहाँ जाहिरा तौर पर दो दृष्टिकोण जब (एक नई पायथन दुभाषिया उदाहरण के भीतर) एक नई प्रक्रिया को उत्पन्न करने हैं:
# Approach 1(a)
p = subprocess.Popen(['python', mySubprocessPath], shell = True)
# Approach 1(b) (J.F. Sebastian)
p = subprocess.Popen([sys.executable, mySubprocessPath])
# Approach 2
p = multiprocessing.Process(target=foo, args=(q,))
दूसरा दृष्टिकोण स्पष्ट नकारात्मक पक्ष यह है कि यह सिर्फ एक समारोह को निशाना बनाता है - जबकि मैं एक नया अजगर स्क्रिप्ट को खोलने के लिए की जरूरत है । वैसे भी, क्या दोनों दृष्टिकोण प्राप्त होते हैं जो वे प्राप्त करते हैं?
https://docs.python.org/2/library/multiprocessing.html – mootmoot
मैं तुम्हें सवाल तुम क्यों जो भौतिक कोर अपने धागे को चलाने पर ध्यान देना चाहिए लगता है। ओएस आमतौर पर विभिन्न कारकों के आधार पर सिस्टम में उपलब्ध सीपीयू के बीच धागे को स्थानांतरित करेगा। क्या कोई विशेष कारण है कि आप इस प्रक्रिया के साथ निगरानी और/या हस्तक्षेप करना चाहते हैं? – Dolda2000
अच्छा सवाल :-)। हां, मेरा मानना है कि मेरे पास वैध कारण है। मैं पायथन में डेटा अधिग्रहण प्रणाली का निर्माण कर रहा हूं, जो मेरे माइक्रोकंट्रोलर डेटा (जैसे एनालॉग इनपुट, ...) पढ़ता है और मेरे जीयूआई में लाइव ग्राफ दिखाता है। जब तक आने वाला डेटा सीमित हो, तब तक कोई भी मल्टीप्रोसेसिंग की परवाह नहीं करता है। लेकिन एक बार यह वास्तव में तेजी से हो जाता है, मैं नियंत्रण में रहना चाहता हूँ। हो सकता है कि मैं अपने पाइथन सॉफ़्टवेयर के कुछ कम-विलंबता वाले हिस्सों को समर्पित सीपीयू कोर पर चला सकूं जो कि मैं किसी और चीज के लिए उपयोग नहीं करता, इसलिए उच्च प्रतिक्रिया सुनिश्चित करता हूं। –