异步 - 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。