Appearance
并发模型
目标
Qlang 的并发模型要做到:
- 默认避免数据竞争
- 语法比手工线程和回调更简单
- 能写高吞吐服务端和工具型并行任务
- 不把异步语义做成黑箱
结构化并发优先
Qlang 并发模型以结构化并发为主,而不是“随便开线程,靠约定收尾”。
建议核心构造:
async fnawaitasync letspawnselecttimeoutcancel
设计原则是:任务的创建、等待、取消、错误传播,都要有明确的宿主作用域。
发送性和共享性
并发安全检查建立在类型系统之上:
- 可跨任务传递的类型自动满足
Send - 可并发共享只读访问的类型满足
Sync - 包含非线程安全资源的类型不自动满足这些能力
这类能力 trait 应自动推导,但允许显式标注和诊断解释。
actor 作为高层模型
Qlang 适合把 actor 设计成标准库和运行时的一等抽象,而不是核心语法硬编码。原因是:
- actor 更适合 I/O 密集与状态机密集场景
- actor 能作为共享可变状态的替代方案
- actor API 可以持续演进,不必被语言语法锁死
语言层需要做的,是给 actor 提供:
- 明确的隔离边界
- 消息类型检查
- 可取消与可观测的任务模型
执行器策略
异步执行器建议从第一天就做成可替换架构:
- 默认执行器覆盖常规应用
- 嵌入式或特殊场景允许自定义执行器
- 编译器只负责 lowering,不绑定唯一 runtime
这能避免把整门语言和单一运行时绑死。
并发错误处理
并发中的错误传播应与普通 Result 体系统一:
- 子任务失败可以向上传播
- 聚合任务支持收集多个失败
- 取消是受控状态,不是异常副作用
P0 与 P1 边界
P0
async fnawaitspawnselectSend/Sync基础检查
P1
- actor 标准库
- structured cancellation
- async stream
- tracing 和调试可视化
P2
- 分布式 actor
- effect-aware scheduler hints
- 更细粒度的并发静态分析
Qlang 不需要在第一阶段做“最大而全”的并发模型,但必须从一开始就防止日后推翻语义。