当使用epoll级别触发的通知时,您将EPOLLOUT在套接字上收到持续的通知,除了套接字的输出缓冲区实际上已满的短暂时间段之外。这样做的影响是,即使您没有要发送的内容,也没有要接收的数据,您的事件循环也会被唤醒。
为了解决这个问题,您有两个实用的选择:
禁用EPOLLOUT直到您真正获得EWOULDBLOCK/ EAGAIN。此时,您可以启用EPOLLOUT,并在发送完成后再次禁用它。
启用边缘触发通知,并EPOLLOUT始终保持启用状态。EPOLLOUT现在,只有当系统从输出缓冲区满状态更改为非满状态时,您才会收到通知。但是,EPOLLIN现在也是边缘触发的,这意味着EPOLLIN在耗尽输入缓冲区之前您只会收到一个通知。
在评论中,向您提供了第三个选项来实现您自己的轮询循环来处理具有完整输出缓冲区的套接字。这可以工作,但不应该是必要的,因为epoll可以告诉你什么时候可以写。