2012-06-07 9 views
21

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

मैं वर्तमान में इस कोड का उपयोग कर रहा है, और python process takes 100% CPU पर एक नज़र ले लिया है:

while True: 
    #do some serial sending here 
    time.sleep(0.2) 

इस कोड काम करता है। हालांकि, भेजने की गति धीमी है। मैंने sleep अंतराल को कम करके इसे तेज़ी से बनाने की कोशिश की, लेकिन ऐसा लगता है कि सीपीयू को थोड़ा अधिक लोड करना प्रतीत होता है।

संक्षेप में, क्या हमेशा के लिए थोड़ी देर के लूप पर प्रभावी ढंग से पुनरावृत्ति करने का कोई तरीका है, जबकि अभी भी CPU संसाधनों की कम खपत को बनाए रखना है?

+0

इस [पोस्ट] (http://stackoverflow.com/questions/529034/python-pass-or-sleep-for-long-running-processes) के आधार पर, time.sleep बहुत छोटा ओवरहेड है, आप चाहें कोड – xvatar

+1

कोड के अपने सीरियल भेजने के हिस्से की जांच करने के लिए क्या आपने 0.00001 के लिए सोने की कोशिश की है? यह हास्यास्पद प्रतीत हो सकता है, लेकिन वह देरी आपके सीपीयू के लिए दुनिया में सभी दुविधाएं कर सकती है। कृपया इसे आजमाएं। – jakebird451

+0

एक आधुनिक कंप्यूटर एक धारावाहिक बंदरगाह पर पसीना लिखने में कैसे टूट सकता है? धारावाहिक नहीं होगा। सीरियल() लिखते समय लिखते हैं? ऐसा लगता है कि सीपीयू अन्य चीजों को करने के लिए पर्याप्त समय लगता है? – Bittrance

उत्तर

37

धीमी सीपीयू बर्बाद करने वाला हिस्सा "सीरियल भेजना" है। थोड़ी सी नींद के साथ जबकि लूप नगण्य CPU का उपयोग करेगा।

क्या आप सीरियल भेजने कोड दिखा सकते हैं। इसे गति देने का एक तरीका हो सकता है।

इस बल्कि धीमी गति से सीपीयू मैं यह देखने में:

import time 
while True: range(10000) and None; time.sleep(0.2)  # 1% CPU 
while True: range(10000) and None; time.sleep(0.02)  # 15% CPU 
while True: range(10000) and None; time.sleep(0.002) # 60% CPU 
while True: range(10000) and None; time.sleep(0.0002) # 86% CPU 

मैं दुभाषिया में उन लोगों के भाग गया और Ctrl- साथ प्रत्येक पाश जबकि बंद कर दिया:

import time 
while True: time.sleep(0.2)  # 0% CPU 
while True: time.sleep(0.02)  # 0% CPU 
while True: time.sleep(0.002) # 0.5% CPU 
while True: time.sleep(0.0002) # 6% CPU 
while True: time.sleep(0.00002) # 18% CPU 

अब पाश में कुछ अतिरिक्त काम करते हैं सी।

+0

वैकल्पिक रूप से, मैं एक स्विच का उपयोग कर सीरियल में गुजरने को सीमित कर सकता हूं, हालांकि, एम्बेडेड डिवाइस को पुन: प्रोग्राम करने का मतलब भी है। कोड \t आदेश की तरह कुछ 'w' \t जबकि यह सच है लग रहा है =: \t \t अगर (आदेश = एक्स!): \t \t \t #pyserial स्ट्रिंग यहाँ इस मामले w में भेजने के लिए,। बाहरी हैंडलर के माध्यम से बदल गया। बाकी \t \t: \t \t \t #tell pyserial कनेक्शन – jhtong

+0

बंद करने के लिए ऐसा लगता है कि मैं दोनों कंप्यूटर और माइक्रोप्रोसेसर तरफ एक स्विचिंग की जांच लागू करने के लिए, भेजा आदेशों की संख्या को कम करने के लिए है। फिर सोने के लिए चिपकें (0.2) ताकि CPU उपयोग उतना ऊंचा न हो। यानी अंतिम आदेश को सहेजें, और यदि इसे भेजा गया है, तो इसे दोबारा न भेजें। इस बीच, माइक्रोप्रोसेसर एक रोकथाम कमांड 'एक्स' के लिए इंतजार करेगा। अगर प्राप्त नहीं होता है, तो यह वर्तमान/पिछली कमांड को अपनी गति से संसाधित करना जारी रखेगा। – jhtong

+0

यदि आप माइक्रोकंट्रोलर हैं तो "मौजूदा कमांड को अपनी गति से संसाधित करना जारी रखेंगे", तो आपके पायथन कोड पर थोड़ी देर की लूप की आवश्यकता नहीं है। मुझे संदेह है कि सीरियल पोर्ट संचार के लिए किसी भी प्रकार की लाइब्रेरी आपको किसी भी तरह के लूप को कॉल करने के लिए _require_ करेगा। शायद लाइब्रेरी दस्तावेज़ीकरण को फिर से पढ़ें क्योंकि ऐसा लगता है कि आप इसे गलत इस्तेमाल कर रहे हैं। लाइनों के बीच पढ़ने के लिए –

3

आपको उस व्यापार को समझना होगा जिसे आप गति और सीपीयू लोड के बीच रखना चाहते हैं।

यदि आपको संदेशों के बीच इतना कुछ नहीं करते समय डेटा के छोटे विस्फोट भेजना पड़ता है, तो हो सकता है कि आप थोड़े समय के लिए उच्च CPU लोड के साथ रह सकें क्योंकि औसत अभी भी कम हो सकता है।

+0

धन्यवाद, हालांकि, इसका मतलब स्विच का उपयोग करने के लिए माइक्रोकंट्रोलर को पुन: प्रोग्राम करना हो सकता है। इसे आगे जाना है, इसलिए 'डब्ल्यू' भेजा जाना है। यदि कोई 'डब्ल्यू' कुंजी नहीं मिली है, तो मोटर नहीं चलेगी। इसलिए, अगर इसे बहुत धीरे-धीरे भेजा जाता है, तो मोटर भी धीमी गति से आगे बढ़ेगी। – jhtong

4

जोआचिम के जवाब पर अपनी टिप्पणी के बारे में:

फिर अपने माइक्रो कोड एक नया स्वरूप की जरूरत है। अन्यथा आप केवल सामान्य उद्देश्य कंप्यूटर को एक गूंगा "माइक्रोकंट्रोलर" से अधिक कुछ नहीं कर रहे हैं जो अनियंत्रित कोड पर बार-बार पुनरावृत्त होता है, इसलिए 100% सीपीयू। आपके कंप्यूटर का गलत इस्तेमाल करने का एक अन्य लक्षण यह तथ्य है कि आपकी हार्डवेयर मोटर की गति उस गति पर निर्भर करती है जिस पर आप सीरियल इंटरफेस के माध्यम से इसे कमांड भेजते हैं। आपको कंप्यूटर के साथ "कमांड" करने की आवश्यकता है जो आपके उच्च स्तरीय तर्क को होस्ट करेगा। और आपके माइक्रो नियंत्रक को मोटर के निम्न-स्तर, दोहराव वाले नियंत्रण को संभालने की आवश्यकता है।

+1

+1। – Vorac

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