这是WWDC 2023年第Beyond the basics of structured concurrency
届会议的笔记.
许多AsyncSequences是用状态机实现的,我们使用状态机来停止运行的序列.
public func next() async -> Order? {
return await withTaskCancellationHandler {
let result = await kitchen.generateOrder()
guard state.isRunning else {
return nil
}
return result
} onCancel: {
state.cancel()
}
}
- 虽然参与者非常擅长保护封装状态,但他们并不能真正保护状态机.
- 修改和读取状态机上的各个属性,参与者并不是完全正确的工具.
- 无法保证操作在参与者上运行的顺序,因此我们无法确保我们的取消将首先运行.
- 使用Swift Atomics包中的原子、调度队列或锁.
private final class OrderState: Sendable {
let protectedIsRunning = ManagedAtomic<Bool>(true)
var isRunning: Bool {
get { protectedIsRunning.load(ordering: .acquiring) }
set { protectedIsRunning.store(newValue, ordering: .relaxed) }
}
func cancel() { isRunning = false }
}
看完这部分后,我不明白为什么演员不是一个好的 Select .请对此进行一些解释.