标准答案
- 水平触发只要 socket 仍可读或可写,下一轮等待仍可能收到通知,代码更容易写对。
- 边缘触发减少重复通知,但应用必须把 fd 设置为非阻塞,并在一次事件中尽量读空或写到 EAGAIN。
- 无论哪种模式,都要正确处理 partial read/write、EINTR、对端关闭和错误事件。
- 性能优化要以事件循环实际负载和代码正确性为依据,不能因为边缘触发听起来更快就直接切换。
题目解析
epoll 关注文件描述符是否具备某种 I/O 条件,LT 会在条件持续存在时反复通知,ET 更强调状态从未就绪到就绪的变化。ET 通常要求非阻塞 fd,并在一次事件中持续读写直到 EAGAIN;否则剩余数据可能没有下一次事件提醒。
readable 只表示当前可以读到一些字节,不代表已经收到一条完整 HTTP、RPC 或自定义协议消息;应用仍要维护缓冲区和消息边界。writable 也只代表暂时有发送空间,写操作可能 partial write,必须保留未发送数据并在后续事件继续发送。
常见误区
- 误区:边缘触发收到一次事件只读一次。改正:使用非阻塞 fd 循环读写,直到 EAGAIN 或完成协议边界。
- 误区:把 readable 当成一条完整业务消息。改正:按协议长度、分隔符或帧结构解析并维护缓冲。
- 误区:忽略写缓冲和 partial write。改正:保存未发送字节,监听可写事件并设置缓冲上限。