异步 - inline-function/Sublimation GitHub Wiki

异步

凝华的异步目标是"够用":编译到 JS,配合 @async/Task/Channel。

异步函数 @async

标注 @async 的函数是异步函数。没有 await 关键词——调用异步函数自动 await。

@async
fun main() {
    var r = readFile("data.txt")   // 异步调用,自动 await(不需要写 await)
    print(toStr(r))
}
  • 只有异步函数可以调用异步函数。
  • main() 天然是 async 上下文;Task 体也天然 async。

任务 Task

var t = Task { expensiveWork() }   // 并发启动

通道 Channel

协调异步数据传递:

var ch = Channel[Nat]()           // 无缓冲(默认)
ch.send(1)                        // 满则发送方等待
var v = ch.receive()              // 空则接收方等待

锁 Mutex

防止数据竞争:

var mu = Mutex()
mu.lock()
// ... 操作共享状态 ...
mu.unlock()
// 或一行搞定:
mu.withLock({ doWork() })

原子操作 @atomic

@atomic var counter = 0           // 对该类型的读写是原子的

流 Flow

惰性冷流:

flow.map({ v -> v * 2 })                       // 组合
flow.collect({ v -> print(toStr(v)) })         // 消费

一句话

  • 异步函数用 @async,调用自动 await,不用写 await。
  • 并发用 Task;协调用 Channel;防竞争用 Mutex/@atomic;惰性流用 Flow。