2009-08-25 9 views
12

मैंने एक धारावाहिक बंदरगाह के आउटपुट की निगरानी करने के लिए एक स्क्रिप्ट बनाई है जो हर आधा घंटे डेटा की 3-4 लाइनें प्राप्त करती है - स्क्रिप्ट ठीक चलती है और बंदरगाह से निकलने वाली हर चीज़ को पकड़ती है दिन के अंत में क्या मायने रखती है ...पायथन/पायसियरियल और सीपीयू उपयोग

क्या कीड़े मुझे यह है कि CPU उपयोग नहीं बल्कि एक प्रोग्राम है जो सिर्फ एक सीरियल पोर्ट की निगरानी कर रहा है के लिए उच्च लगता है, 1 कोर हमेशा 100% उपयोग में हो जाएगा इस जबकि लिपि चल रही है।

मैं मूल रूप से इस सवाल में कोड का एक संशोधित संस्करण चल रहा हूँ: pyserial - How to Read Last Line Sent from Serial Device

मैं मतदान की कोशिश की है नियमित अंतराल पर inWaiting() फ़ंक्शन और इसे नींद जब (inWaiting) होने 0 है - मैं मैंने 1 सेकंड से 0.001 सेकेंड तक अंतराल की कोशिश की (मूल रूप से, जितनी बार मैं सीपीयू उपयोग को चलाए बिना कर सकता हूं) - यह पहली पंक्ति को पकड़ने में सफल होगा लेकिन बाकी डेटा को याद करने में प्रतीत होता है।

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

  • क्या इस सीपीयू का उपयोग कर पाइथन/पेसरियल होना चाहिए? (यह ओवरकिल जैसा लगता है)
  • क्या मैं इस खोज पर अपना समय बर्बाद कर रहा हूं/क्या मुझे सिर्फ बुलेट काटने और स्क्रिप्ट को उस अवधि के लिए सोना चाहिए, जो मुझे पता है कि कोई डेटा नहीं आ रहा है?

उत्तर

13

शायद आप read(1) कॉल अवरुद्ध कर सकते हैं, और जब यह शेष बाइट्स की सही संख्या प्राप्त करने के लिए read(inWaiting()) का उपयोग करता है।

+0

बहुत बढ़िया! यह अब एक बिल्ली का बच्चा की तरह शुद्ध है, शून्य सीपीयू उपयोग के बगल में और यह उस सब कुछ पकड़ लेता है जिसे मैं फेंक रहा हूं। मैं इस इंप्रेशन के तहत पढ़ने (inWaiting()) का उपयोग कर रहा था कि यह पढ़ने के समान ही काम करेगा (1) - जाहिर है यह मामला नहीं है। मेरे लिए वह सही करने के लिए धन्यवाद। –

+0

कूल, और मुझे पाइसरियल खोजने के लिए धन्यवाद, मैं इसे अगली बार सीरियल बंदरगाहों के साथ खेलता हूं :) – tonfa

+0

यह उत्कृष्ट है - सेटअप और उपयोग करने के लिए दर्द रहित, यह एकमात्र चीज थी जिसमें मुझे परेशानी थी और ** मैं ** समस्या थी –

0

क्या सिस्टम शैली समाधान बेहतर होगा? पाइथन स्क्रिप्ट बनाएं और इसे क्रॉन/अनुसूचित कार्य के माध्यम से निष्पादित किया गया है?

pySerial उस सीपीयू का उपयोग नहीं करना चाहिए, लेकिन अगर यह सिर्फ एक घंटे के लिए मतदान कर रहा है तो मैं देख सकता हूं कि यह कैसे हो सकता है। आवधिक जागरूकता और चुनाव के संयोजन के साथ सोना बेहतर विकल्प हो सकता है।

+2

यदि आप क्रॉन या नींद से भागते हैं, तो आप सीरियल आउटपुट को याद करेंगे। कार्यक्रम को एक डेमन या सक्रिय प्रक्रिया के रूप में चलाया जाना चाहिए। – jmanning2k

+0

मैं सुझाव TheLobster की सराहना करता हूं, लेकिन jmanning2k को इसका अधिकार मिला है - यह प्रक्रिया की तरह एक डिमन होना है। हम हर आधा घंटे डेटा प्राप्त करेंगे, लेकिन यह उतना ही सटीक होगा जितना होगा। एक क्रॉन/शेड्यूल किए गए कार्य दृष्टिकोण को * काम करने के समय में सटीक * सटीक होना चाहिए और सबसे छोटा परेशान होने के परिणामस्वरूप डेटा खो जाएगा। वह बस नहीं करेगा। –

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