Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何托管websocket并在不阻塞的情况下与串行端口交互?_Python_Websocket_Event Handling_Serial Port_Blocking - Fatal编程技术网

Python:如何托管websocket并在不阻塞的情况下与串行端口交互?

Python:如何托管websocket并在不阻塞的情况下与串行端口交互?,python,websocket,event-handling,serial-port,blocking,Python,Websocket,Event Handling,Serial Port,Blocking,我正忙于开发一个Python系统,它使用web套接字从串行端口发送/接收数据 为了使其工作,我需要在接收到串行端口的数据时对其作出反应。问题是要检测传入数据,需要连续查询串行端口以查找传入数据。很可能是一个连续的循环。根据以前使用Flask的经验(磁盘访问速度慢+流量大),这听起来可能会导致web套接字被阻塞。是这样还是有解决办法 我已经看过NodeJS是如何与串行端口交互的,它看起来好多了。当有传入数据时,它会引发一个事件,而不是一直查询它。这是Python中的一个选项吗 额外详细信息: 目

我正忙于开发一个Python系统,它使用web套接字从串行端口发送/接收数据

为了使其工作,我需要在接收到串行端口的数据时对其作出反应。问题是要检测传入数据,需要连续查询串行端口以查找传入数据。很可能是一个连续的循环。根据以前使用Flask的经验(磁盘访问速度慢+流量大),这听起来可能会导致web套接字被阻塞。是这样还是有解决办法

我已经看过NodeJS是如何与串行端口交互的,它看起来好多了。当有传入数据时,它会引发一个事件,而不是一直查询它。这是Python中的一个选项吗

额外详细信息:

  • 目前,它只能在Linux上运行
  • Flask是我的第一个选择,但我对其他Python框架持开放态度
  • pyserial用于串行连接。(是我知道的唯一选项)

只需启动一个子进程,该子进程侦听串行套接字,并在有消息时引发事件。每个web端口都有一个单独的子进程,可以执行相同的操作。

Python提供了一个可以执行您想要的操作的子进程。但这取决于您使用的操作系统。既然你没有提供这些信息,我就没什么帮助了。但是,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这样的系统的一般过程

请命名您的操作系统。您使用的是pyserial还是什么?例如,您可以在Unix上使用
select.select
轮询串行设备,这样即使使用单个线程也可以执行该程序。此外,当前您的问题有点问题,可以用“可以”来回答。或者,如果还不够,那么你的问题太宽泛了……虽然这是一种方法,但不一定是最简单的。所有主要的操作系统都支持某种socket/fd监控。用于Linux的epoll、用于*BSD/MacOSX的kqueue和Windows中的IOCP。只回调WebSocket和串行端口,在数据到达时处理每个端口的数据要容易得多。@aychedee-因为没有指定操作系统,所以不清楚使用哪一个&我个人喜欢尽可能采用跨平台的方法。看起来确实缺少一个库。以统一方式跨平台进行套接字监控的一种方法:)什么是
websocket\u文件\u描述符
serial\u文件\u描述符
?它们将是web套接字连接和串行连接的文件描述符()。您可以读取和写入文件描述符。因此,如果使用套接字库创建连接,它将返回一个文件描述符。