2011-11-24 15 views
6

मैं दो धारावाहिक बंदरगाहों (/ dev/ttyS1 और/dev/ttyS2) पढ़ने के लिए समांतर प्रसंस्करण/थ्रेडिंग का उपयोग कर एक अजगर वर्ग लिखने की कोशिश कर रहा हूं। इन दोनों बंदरगाह 1 9 200 की बॉड दर पर चल रहे हैं और लगातार सक्रिय हैं। मैंने इस उद्देश्य के लिए pySerial का उपयोग किया।सीरियल बंदरगाहों को पढ़ने के लिए पाइथन एकाधिक धागे/एकाधिक प्रक्रियाएं

दोनों पढ़ने के संचालन को निरंतर और समवर्ती रूप से चलाने की आवश्यकता है। मैं सोच रहा हूं कि थ्रेड लाइब्रेरी या थ्रेडिंग लाइब्रेरी या मल्टीप्रोसेसिंग लाइब्रेरी का उपयोग करना चाहिए या नहीं। मैं केवल वैश्विक दुभाषिया ताला के कारण चिंतित हूं जो 'भारी आईओ संचालन के लिए सही थ्रेडिंग क्षमता नहीं देता है। लेकिन यदि वैश्विक दुभाषिया ताला मुझे प्रभावित नहीं करता है तो मैं थ्रेडिंग/थ्रेड मॉड्यूल का उपयोग करूंगा। हालांकि अगर ऐसा होता है तो मुझे पाइथन मल्टीप्रोसेसिंग लाइब्रेरी को संकलित करना होगा क्योंकि यह एक एम्बेडेड सिस्टम पर है।

तो मेरे कोड में आमतौर पर थ्रेड 1 या प्रक्रिया 1 = ttyS1 पढ़ने और पढ़ने वाली रेखाओं पर कुछ स्ट्रिंग संचालन करने के बाद एक बफर को लिखना होगा। thread2 या process2 = ttyS2 को पढ़ने और पढ़ने के लिए कुछ स्ट्रिंग ऑपरेशंस करने के बाद अन्य बफर को लिखना। अन्य कार्य आदि इन बफर का कोड कोड के अन्य भागों द्वारा आगे उपयोग किया जाता है।

क्या पाइथन में मल्टीप्रोसेसिंग में एकाधिक कोर/सीपीयू की आवश्यकता होती है?

पढ़ने के लिए धन्यवाद!

उत्तर

1

जीआईएल को पढ़ने के दौरान जारी किया जाता है, इसलिए इससे आपको बहुत प्रभावित नहीं होना चाहिए। क्रॉस-कंपाइलिंग multiprocessing ओवरकिल, या कम से कम समयपूर्व अनुकूलन की तरह लगता है। कोड मॉड्यूलर रखें ताकि बाद में स्विच कर सके।

मुझे विश्वास है कि थ्रेडिंग प्रदर्शन आपके ओएस पर निर्भर करेगा।आपका माइलेज अलग-अलग होगा, खासकर एक एम्बेडेड सिस्टम पर।

यदि आपके पास अतिरिक्त समय है, तो डेविड बीज़ले द्वारा talk on the GIL (पीडीएफ स्लाइड here) है। उच्च प्रदर्शन थ्रेडिंग के लिए, आप इसे देखना चाहते हैं कि थ्रेडिंग, जीआईएल, और ओएस प्रदर्शन को मारने के लिए सभी कैसे मिलकर काम कर सकते हैं।

+0

जीआईएल जारी होने के बारे में जानकारी के लिए धन्यवाद। एम्बेडेड सिस्टम बीमार उपयोग arm5tel आर्किटेक्चर के साथ 550 मेगाहट्र्ज सीपीयू पर होगा। मुझे लगता है कि बीमार सिर्फ अलग-अलग सेट अप के साथ कुछ बेंचमार्किंग करना है और देखें कि मैं इससे कितना बाहर निकल सकता हूं। वीडियो बीमार के लिए भी धन्यवाद, इसे देखो! – kal

1

मैं इस विषय पर किसी भी तरह से विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि threading का उपयोग करने वाले अतिरिक्त सूक्ष्मता की आवश्यकता के लिए प्रयास करना उचित नहीं है यदि मैं इसके बजाय प्रक्रियाओं के माध्यम से समानांतर हो सकता हूं।

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

OP के अनुरोध पर संपादित करें: आप धारावाहिक इंटरफेस के लिए अलग-अलग स्क्रिप्ट बनाकर समांतर प्रसंस्करण प्राप्त कर सकते हैं। यह एक त्वरित डेमो है, यह मानता है कि दोनों फाइलें एक ही निर्देशिका में हैं।

फ़ाइल com.py - धारावाहिक स्क्रिप्ट - यह सिर्फ एक नकली है, लेकिन यह विचार है कि यहाँ स्क्रिप्ट स्वायत्त चलाता है, और केवल मास्टर कार्यक्रम के साथ संवाद करने stdin और stdout उपयोग करता है।

[email protected]:~/Desktop$ ./master.py 
serial communication started. 
comand sent. 
received : Serial from com1 is 1 
comand sent. 
received : Serial from com1 is 2 
comand sent. 
received : Serial from com1 is 3 

HTH: -

import sys 

counter = 0 
while True: # The program never ends... will be killed when master is over. 
    counter += 1 
    sys.stdin.readline() 
    sys.stdout.write('Serial from com1 is %d\n' % counter) 
    sys.stdout.flush() 

फ़ाइल master.py मुख्य कार्यक्रम

from subprocess import Popen, PIPE 
from time import sleep 

p = Popen(['python', './com.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
print "serial communication started." # com.py is working but we moved on! 
for i in range(3): 
    p.stdin.write('<command-here>\n') 
    print "comand sent." 
    print "received : %s" % p.stdout.readline() 
    sleep(1) 

अंत में, इस उम्मीद उत्पादन का एक डंप है!

+0

क्या आप मेरी समझ में मदद कर सकते हैं कि मेरे परिदृश्य के लिए उपप्रोसेसर कैसे उपयोगी होगा? आपका बहुत बहुत धन्यवाद! – kal

+0

@kal - हो गया। संपादन देखें। – mac

+0

बहुत बहुत धन्यवाद। यह मेरी परेशानियों को हल करता है। – kal

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