我在创建多进程串行记录器时遇到一些问题。 计划:有一个独立的进程从串口读取数据,把数据放入队列。主进程在一段时间后读取整个队列并处理数据。在
但我不确定这样做是否正确,因为有时数据顺序不正确。它适用于慢速通信。在
我一定要锁东西吗?!有没有更聪明的方法?在
import time
import serial
from multiprocessing import Process, Queue
def myProcess(q):
with serial.Serial("COM2", 115200, 8, "E", 1, timeout=None) as ser:
while True:
q.put("%02X" % ser.read(1)[0])
if __name__=='__main__':
try:
q = Queue()
p = Process(target=myProcess, args=(q,))
p.daemon = True
p.start()
data = []
while True:
print(q.qsize()) #!debug
while not q.empty(): #get all data from queue
data.append(q.get())
#proc_data(data) #data processing
time.sleep(1) #emulate data processing
del data[:] #clear buffer
except keyboardInterrupt:
print("clean-up") #!debug
p.join()
更新: 我尝试了另一个基于线程的版本(参见下面的代码),但是效果和问题相同。结转工作正常,但结转和新数据之间的一个字节总是不存在->;当main读取队列时,脚本将丢失该字节?!在
^{pr2}$
考虑下面的代码。在
1)这两个进程是同级的;父进程只需设置它们,然后等待control-C中断所有进程
2)一个进程将原始字节放入共享队列
3)数据第一个字节的其他proc块。当它得到第一个字节时,它将获取其余的数据,以十六进制输出,然后继续。在
4)父进程只设置其他进程,然后使用
signal.pause()
等待中断注意,使用})函数是不可靠的,因此上面的代码将可靠地获取您的数据。在
multiprocessing
,qsize()
(可能还有{来源
相关问题 更多 >
编程相关推荐