Python:串行端口和伪tty之间的异步读/写
我正在尝试编写一个串行“代理”,它将位于进程和物理串行设备之间,并动态地重新编写一些命令。我让它以一种粗糙的方式工作,但它比直接使用物理设备慢得多 为了加快速度,我去掉了除裸读/写之外的所有内容,但性能比预期慢得多 知道我做错了什么吗?我对这种低级的东西非常陌生,我的大部分有限经验是解析json/xml/etc和操作字符串。如有任何想法或提示,将不胜感激 这是简化代码-Python:串行端口和伪tty之间的异步读/写,python,pty,Python,Pty,我正在尝试编写一个串行“代理”,它将位于进程和物理串行设备之间,并动态地重新编写一些命令。我让它以一种粗糙的方式工作,但它比直接使用物理设备慢得多 为了加快速度,我去掉了除裸读/写之外的所有内容,但性能比预期慢得多 知道我做错了什么吗?我对这种低级的东西非常陌生,我的大部分有限经验是解析json/xml/etc和操作字符串。如有任何想法或提示,将不胜感激 这是简化代码- def host_thread( host_port, dv_port ): while True:
def host_thread( host_port, dv_port ):
while True:
try:
char = os.read(host_port, 1)
os.write(dv_port, char)
except OSError as err:
if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK:
pass
else:
raise # something else has happened -- better reraise
def dv_thread( host_port, dv_port ):
while True:
try:
char = os.read(dv_port, 1)
os.write(host_port, char)
except OSError as err:
if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK:
pass
else:
raise # something else has happened -- better reraise
if __name__ == "__main__":
host_port, slave = pty.openpty()
print("Connect to port: %s" % os.ttyname(slave))
fl = fcntl.fcntl(host_port, fcntl.F_GETFL)
fcntl.fcntl(host_port, fcntl.F_SETFL, fl | os.O_NONBLOCK)
dv_port = os.open("/dev/ttyUSB0", os.O_RDWR | os.O_NONBLOCK)
host_thread = threading.Thread(target=host_thread, args=[host_port, dv_port])
host_thread.start()
dv_thread = threading.Thread(target=dv_thread, args=[host_port, dv_port])
dv_thread.start()
while True:
time.sleep(.1)
首先分析您的代码:我所看到的最大问题是,您一次只能读取一个字符,因为python空间内外有多个级别的翻译,这非常缓慢,读取较大的块(如果可能,有一个超时)将比逐个字符快得多,在每个线程上调用
.join()
,而不是while True
循环,这将消除繁忙的循环,可能会为脚本的有用部分释放更多cpu