Python:无法将字符串从while循环中拉到另一个函数

时间:2018-08-02 10:43:49

标签: python while-loop serial-port pyserial

我有一个功能,该功能包括一个while循环,可以从串行端口重复读取。

如何在不中断循环的情况下将这些行拉到另一个函数?

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

3 个答案:

答案 0 :(得分:2)

您可以像这样通过队列和多线程来做到这一点:

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之类的问题。诸如文件之类的资源,那么就不会有问题,或者如果您完全确定处理会很快。

答案 1 :(得分:1)

您可以创建另一个函数,并将刚刚从串行读取的行作为参数提供给该函数:

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

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

编辑:mrangry777指出,此解决方案尽可能简单,如果处理时间更长,则在不同线程中进行读取和处理会更好。如果您认为这可能是个问题,请查看他的答案!

答案 2 :(得分:0)

您没有提供有关具体用例,约束和要求的足够详细信息,因此没有明确的答案。一种可能的解决方案是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)

但是您也可以使用一个异步任务队列,例如celery或我现在无法想到的许多其他解决方案。