ConcurrentML:把通信操作变成值,顺手修掉 Go 的 goroutine 泄漏
来源:nikhilism.com — 2026-10-16
📋 概述
Go 把 CSP 带进主流,但它的通信操作是语句、执行到就生效,select 只能在一组现成操作之间挑一个。ConcurrentML 的核心想法是把通信操作提升为一等值:事件可以先构造、再组合、延迟执行。于是选择与取消统一成同一套抽象,并发逻辑可以封装与组合,这在 Go 里做不到。更实用的一点是阻塞线程能被 GC 回收,不必像 Go 那样处处担心 goroutine 泄漏——Go 1.27 才刚加上泄漏检测器。文章全部用 Racket 演示,因为 Racket 是今天把这套模型支持得最完整的语言。
🔑 核心要点
- 一句话差异:CML 里通信是描述操作的值,执行是另一件事;Go 里通信是到时即执行的语句
- 统一抽象带来组合性:选择(choose)与取消都是事件,取消不再是额外机制
- 线程自动回收是最大收益:Racket 中阻塞中的服务线程没有被引用就会被 GC,Go 中它会永久占着内存
- 他用“随便起个线程去发可能永远没人收的消息”这种写法演示,而这在 Go 里是典型 bug
- Go 1.27 才发布基于泄漏检测器的工具,作者认为这恰好说明问题存在已久
💡 金句
In CML, however, these blocked threads are not a problem because they will be automatically garbage collected.
👍 0
👎 0
← 返回 Lobsters 首页