主要观点:Sans I/O 是实现网络协议的软件设计模式,其 I/O 无关库可重用、更利于高质量软件工程实践,通过 I/O 集成层与网络 I/O 框架连接。Sans I/O 可解决 websockets 因与 asyncio 强耦合带来的问题,如测试复杂缓慢、需重复编写 HTTP 实现、组合性差等,但实施较难,存在协议状态管理、自动响应处理、错误处理、I/O 相关事宜等挑战,虽 API 看似简单但实际实施复杂,且处于低层级,在处理 EOF 等问题时仍有部分协议层面的工作需 I/O 集成层负责。
关键信息:
- Sans I/O 库无网络 I/O 和异步控制流,可复用且与其他 I/O 无关库可组合。
- websockets 因与 asyncio 强耦合面临多种问题,如支持不同代理、集成其他项目困难等。
- 实施 Sans I/O 时需注意协议状态、自动响应处理、错误处理等,如通过对象封装状态、处理自动响应时让函数返回输出数据等。
- Sans I/O 低层级,需自行实现流读取器等,处理并发和 I/O 相关事宜困难,部分协议工作仍需 I/O 集成层负责。
重要细节:
- websockets 测试复杂缓慢,需大量时间与 asyncio 斗争,添加魔法支持写协程测试但仍慢,依赖 asyncio 实现细节,测试易出错。
- 为支持 WebSocket 连接需编写 HTTP 实现,HTTP/2 时更困难,Sans I/O 原则下可更易切换 HTTP 实现。
- asyncio 组合性不佳,如未将 TLS 实现为 TCP 传输上的协议,移植 websockets 到其他框架障碍高。
- 实施 Sans I/O 时要考虑协议状态机、自动响应、错误处理等,如处理错误时可将异常存储在连接状态等。
- Sans I/O 低层级,处理网络 I/O 需自行实现流读取器,处理并发需依赖
concurrent.futures.Future
或让 I/O 集成层处理,部分协议工作仍在 I/O 集成层。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。