Notes on structured concurrency, or: Go statement considered harmful
3 hours ago
- #concurrency
- #software-design
- #programming-languages
- 并发 API 传统上使用 go 语句(线程生成、回调、future)来允许后台任务独立运行,类似于控制流中的 goto 语句。
- Go 语句破坏了抽象,使得函数不再是黑盒(它们可以在调用者不知情的情况下生成任务),扰乱了自动资源清理,并阻碍了正确的错误传播。
- Trio 引入了托儿所(nursery)作为结构化替代方案,其中任务在托儿所块内启动,父任务在退出前等待所有子任务完成,确保控制流遵循‘黑盒’规则。
- 托儿所保留了函数抽象,支持动态任务生成,允许显式传递托儿所对象以提供灵活性,支持自定义类似托儿所的类型,并集成了自动错误传播和取消功能。
- 移除 go 语句使得 Python 能够实现可靠取消和适当的 Control-C 处理等新功能,托儿所鼓励更清晰、更健壮的并发编程,正如 Trio 中简化的实现(如 Happy Eyeballs)所展示的那样。