Skip to content

并发模型

目标

Qlang 的并发模型要做到:

  • 默认避免数据竞争
  • 语法比手工线程和回调更简单
  • 能写高吞吐服务端和工具型并行任务
  • 不把异步语义做成黑箱

结构化并发优先

Qlang 并发模型以结构化并发为主,而不是“随便开线程,靠约定收尾”。

建议核心构造:

  • async fn
  • await
  • async let
  • spawn
  • select
  • timeout
  • cancel

设计原则是:任务的创建、等待、取消、错误传播,都要有明确的宿主作用域。

发送性和共享性

并发安全检查建立在类型系统之上:

  • 可跨任务传递的类型自动满足 Send
  • 可并发共享只读访问的类型满足 Sync
  • 包含非线程安全资源的类型不自动满足这些能力

这类能力 trait 应自动推导,但允许显式标注和诊断解释。

actor 作为高层模型

Qlang 适合把 actor 设计成标准库和运行时的一等抽象,而不是核心语法硬编码。原因是:

  • actor 更适合 I/O 密集与状态机密集场景
  • actor 能作为共享可变状态的替代方案
  • actor API 可以持续演进,不必被语言语法锁死

语言层需要做的,是给 actor 提供:

  • 明确的隔离边界
  • 消息类型检查
  • 可取消与可观测的任务模型

执行器策略

异步执行器建议从第一天就做成可替换架构:

  • 默认执行器覆盖常规应用
  • 嵌入式或特殊场景允许自定义执行器
  • 编译器只负责 lowering,不绑定唯一 runtime

这能避免把整门语言和单一运行时绑死。

并发错误处理

并发中的错误传播应与普通 Result 体系统一:

  • 子任务失败可以向上传播
  • 聚合任务支持收集多个失败
  • 取消是受控状态,不是异常副作用

P0 与 P1 边界

P0

  • async fn
  • await
  • spawn
  • select
  • Send / Sync 基础检查

P1

  • actor 标准库
  • structured cancellation
  • async stream
  • tracing 和调试可视化

P2

  • 分布式 actor
  • effect-aware scheduler hints
  • 更细粒度的并发静态分析

Qlang 不需要在第一阶段做“最大而全”的并发模型,但必须从一开始就防止日后推翻语义。

Qlang research repository