我有一个功能,该功能包括一个while循环,可以从串行端口重复读取。
如何在不中断循环的情况下将这些行拉到另一个函数?
def reading_from_serial():
while 1:
read_line = ser.readline()
答案 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或我现在无法想到的许多其他解决方案。