मेरे पास ऐसा कार्य है जिसमें थोड़ी देर का लूप शामिल है जो बार-बार सीरियल पोर्ट से पढ़ रहा है।

मैं लूप को तोड़े बिना उन पंक्तियों को किसी अन्य फ़ंक्शन पर खींचने का प्रबंधन कैसे करूं?

def reading_from_serial():
    while 1:
       read_line = ser.readline()
-1
GP1308 2 अगस्त 2018, 13:43
तुम लोग यहाँ "खींचो" से क्यों करते हो?
 – 
Stop harming Monica
2 अगस्त 2018, 14:32
मेरा मतलब किसी अन्य फ़ंक्शन को ट्रिगर करने के लिए उन read_lines का उपयोग करना है
 – 
GP1308
3 अगस्त 2018, 14:31
मैं यह भी नहीं समझता। क्या मौजूदा उत्तरों में से कोई भी आपकी समस्या का समाधान करता है?
 – 
Stop harming Monica
3 अगस्त 2018, 19:12
असल में मैंने अभी तक सभी समाधानों की कोशिश नहीं की है। मेरा मतलब कुछ समय के लूप में "रिपोर्ट" जैसा कुछ है जो वर्तमान पठन लाइन को किसी अन्य फ़ंक्शन पर पास कर रहा है जो विशिष्ट लाइन के आधार पर एक क्रिया करेगा
 – 
GP1308
5 अगस्त 2018, 09:13

3 जवाब

आप इसे कतारों और मल्टीथ्रेडिंग के माध्यम से ऐसा कर सकते हैं:

from queue import Queue
from threading import Thread


...
queue = Queue()
def reading_from_serial():
    while 1:
        read_line = ser.readline()
        queue.put(read_line)


def output():
    while True:
        new_line = queue.get()
        print(new_line)


Thread(target=output).start()
Thread(target=reading_from_serial).start()

queue ऑब्जेक्ट को दोनों कार्यों के लिए पैरामीटर के रूप में भी आपूर्ति की जा सकती है।

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

2
CodeSamurai777 2 अगस्त 2018, 14:35
1
आपको ऐसा नहीं करना चाहिए। आप इसे स्पष्ट रूप से कर सकते हैं, लेकिन इसका मतलब यह नहीं है कि आपको "चाहिए", और अन्य बहुत आसान समाधान हैं।
 – 
bruno desthuilliers
2 अगस्त 2018, 14:12
@ bruno deshuilliers कृपया विस्तृत करें कि क्यों नहीं
 – 
CodeSamurai777
2 अगस्त 2018, 14:13
जैसा कि मैंने कहा: अन्य समाधान हैं (सबसे अधिक सरल हैं), और ओपी की जरूरतों के लिए कौन सा सही है, यह उन सूचनाओं पर निर्भर करता है जो हमारे पास नहीं हैं। "चाहिए" (जिसका अर्थ है कि यह "उचित समाधान" है) के बजाय "चाहिए" (जिसका अर्थ है कि यह संभावित समाधानों में से एक है) का उपयोग करने के लिए मुझे क्या बग है।
 – 
bruno desthuilliers
2 अगस्त 2018, 14:17
@ ब्रूनो डेस्टुइलियर्स ने जवाब तय किया। हालांकि, मेरी राय में जो मैं सीरियल पोर्ट से पढ़ने के लिए स्वतंत्र हूं जिसे डेटा के स्रोत के रूप में कहा गया था और उसी थ्रेड में लाइनों को संसाधित करने से आसानी से TimeoutError हो सकता है अन्य स्रोत ठीक सीरियल पोर्ट हैं इतना ज्यादा नहीं।
 – 
CodeSamurai777
2 अगस्त 2018, 14:23
आपको यह अंतिम टिप्पणी उत्तर में डालनी चाहिए, यह स्पष्ट करने के लिए कि आप विशेष रूप से यहां धागे का उपयोग करने का सुझाव क्यों देते हैं।
 – 
bruno desthuilliers
2 अगस्त 2018, 14:31

आप एक और फ़ंक्शन बना सकते हैं और उस लाइन को दे सकते हैं जिसे आपने सीरियल से फ़ंक्शन में पैरामीटर के रूप में पढ़ा है:

def reading_from_serial():
    while 1:
        read_line = ser.readline()
        process_line(read_line)

def process_line(line):
    print('Processing line:', line)
    return

संपादित करें: यह समाधान जितना संभव हो उतना सरल है, जैसा कि mrangry777 बताता है, अगर प्रसंस्करण में अधिक समय लगता है तो विभिन्न धागे में पढ़ना और प्रसंस्करण बेहतर होता है। अगर आपको लगता है कि यह कोई समस्या हो सकती है, तो उसका जवाब देखें!

1
sikr_ 2 अगस्त 2018, 14:09
मेरी राय में आपको एक ही सूत्र में पंक्तियों को संसाधित और पढ़ना नहीं चाहिए। चूंकि प्रसंस्करण में बहुत अधिक समय लगने पर यह TimeoutError तक हो सकता है। खासकर सीरियल पोर्ट जैसे सोर्स से।
 – 
CodeSamurai777
2 अगस्त 2018, 13:59

आप अपने ठोस उपयोग के मामले, बाधाओं और आवश्यकताओं के बारे में पर्याप्त विवरण नहीं देते हैं, इसलिए कोई निश्चित उत्तर नहीं है। एक संभावित समाधान थ्रेड और एक कतार का उपयोग करके mrangry777 का उत्तर है, लेकिन यह सबसे सरल होने से बहुत दूर है। अन्य संभावित समाधानों में शामिल हैं

कॉलबैक का उपयोग करना:

def process_line(line):
    # mock
    print(line)

def reading_from_serial(callback):
    while 1:
        read_line = ser.readline()
        callback(read_line)


reading_from_serial(process_line)

जनरेटर का उपयोग करना:

def reading_from_serial():
    while 1:
        read_line = ser.readline()
        yield read_line



def process_line(line):
    # mock
    print(line)

for line in reading_from_serial():
    process_line(line)

लेकिन आप अजवाइन या कुछ अन्य समाधानों जैसे एसिंक कार्य कतार का भी उपयोग कर सकते हैं जिन्हें मैं अभी नहीं सोच सकता।

0
bruno desthuilliers 2 अगस्त 2018, 14:25
मेरा उपयोग सीरियल कनेक्शन में दिखाई देने वाली विशिष्ट लाइन के आधार पर किसी अन्य फ़ंक्शन में एक क्रिया निष्पादित करना है। तो मुझे कुछ ऐसा चाहिए जो वर्तमान लाइन को पढ़ने वाले फ़ंक्शन को लगातार रिपोर्ट करे। आशा है कि यह और अधिक समझ में आता है
 – 
GP1308
5 अगस्त 2018, 09:25