Python 3.x 为什么python选择器模块没有套接字错误事件
在Python 3.x 为什么python选择器模块没有套接字错误事件,python-3.x,sockets,Python 3.x,Sockets,在select中,有一个错误套接字列表或epoll有error事件 但是在选择器模块中,只有事件读取和事件写入的事件 因此,如何在没有事件的情况下知道错误套接字?套接字上的错误将始终导致底层套接字被标记为可读(至少)。例如,如果您正在等待来自远程对等方的数据,而该对等方关闭了其连接端(或abends,它执行相同的操作),则本地套接字将获得事件\u READ标记。当你去读它时,你会得到零字节(文件的结尾),告诉你对等方已经不在了(或者至少已经完成了发送) 类似地,如果您正在等待发送数据,并且对等方
select
中,有一个错误套接字列表或epoll
有error
事件
但是在选择器
模块中,只有事件读取
和事件写入
的事件
因此,如何在没有事件的情况下知道错误套接字?套接字上的错误将始终导致底层套接字被标记为可读(至少)。例如,如果您正在等待来自远程对等方的数据,而该对等方关闭了其连接端(或abends,它执行相同的操作),则本地套接字将获得
事件\u READ
标记。当你去读它时,你会得到零字节(文件的结尾),告诉你对等方已经不在了(或者至少已经完成了发送)
类似地,如果您正在等待发送数据,并且对等方重置了连接,您将收到事件\u WRITE
通知。然后,当您尝试发送时,将从发送中得到一个错误(在python中,这表示异常)
在这里,从select
中丢失的唯一一件事是检测异常情况的能力:从select.select中选择xlist
或从select.poll
中选择POLLPRI
。如果需要,则需要直接使用较低级别的选择模块。(优先级/带外数据不常用,因此这不是一个不合理的选择。)
因此,选择器提供的简化界面实际上不会丢失任何“错误”信息。如果套接字上存在错误,可能会导致从select.poll
返回POLLERR
,远程RST,例如,您将收到事件读取
或事件写入
通知,一旦尝试发送
或接收
,发生的任何错误都将重新触发
要记住select
、poll
和friends的一条经验法则是,指示“可读”的结果实际上意味着“如果您尝试阅读,则不会被阻止”。这并不意味着您将实际从读取中获取数据;您可能会得到一个错误
同样,对于“可写”:您可能无法发送数据,但尝试写入不会阻塞。您是在谈论模块吗?@user2357112是的,我是