我正忙于开发一个使用web-sockets从串行端口发送/接收数据的Python系统。
为此,我需要在收到来自串行端口的数据时做出反应。问题是检测串行端口需要不断查询的传入数据以查找传入数据。很可能是一个连续循环。从以前使用 Flask 的经验(磁盘访问速度慢 + 流量大)来看,这听起来可能会导致 Web 套接字被阻止。会是这种情况还是有解决方法?
我已经研究了NodeJS如何与串行端互,它似乎更好。当有传入数据时,它会引发一个事件,而不是一直查询它。这是 Python 中的一个选项吗?
额外详情:
- 目前,它只能在Linux上运行。(拉斯比安)
- Flask是我的第一个选择,但我对其他Python框架持开放态度。
- 用于串行连接的 pyserial 。(是我所知道的唯一选择)
Python 在 stdlib 中提供了 select
模块,它可以做你想做的事。不过,这取决于您使用的操作系统。因此,由于您没有提供这些信息,因此我不能提供帮助。然而,在Linux下一个简单的例子是:
import select
epoll = select.epoll()
# Do stuff to create serial connection and websocket connection
epoll.register(websocket_file_descriptor, select.EPOLLIN)
epoll.register(serial_file_descriptor, select.EPOLLIN)
while True:
events = epoll.poll(1)
# Do stuff with the event,
for fileno, event in events:
if fileno == serial_file_descriptor:
data = os.read(serial_file_descriptor)
os.write(websocket_file_descriptor, data)
elif fileno == websocket_file_descriptor:
data = os.read(websocket_file_descriptor)
# Do something with the incoming data
这是一个基本的、不完整的例子。但它应该让你了解使用像epoll这样的系统的一般过程。
只需启动一个子进程,该子进程侦听串行套接字并在有消息时引发事件。 为每个 Web 端口设置一个单独的子进程,该子进程执行相同的操作。