AsyncSequence反压:控制数据生产者的速率
实现自定义AsyncSequence,通过协程间通信对生产者施加反压,防止消费者过载。 · 难度:入门 · +10XP
AsyncSequence 反压机制
Swift的AsyncSequence允许异步消费序列,但默认没有反压——如果消费者处理缓慢,生产者可能溢出缓冲区。本教程教你构建一个支持反压的AsyncSequence,使用AsyncStream和Continuation配合一个信号量(如AsyncSemaphore),让消费者在准备好时再请求下一个元素。你将深入理解拉取式(pull-based)与推送式(push-based)模型,并学会在协程间进行流量控制。
actor BackpressuredProducer: AsyncSequence {
typealias Element = Int
private var continuation: AsyncStream.Continuation?
private let stream: AsyncStream
init() {
stream = AsyncStream { continuation in
self.continuation = continuation
}
}
func makeAsyncIterator() -> AsyncStream.Iterator {
stream.makeAsyncIterator()
}
func produce(_ value: Int) async {
// 等待消费者信号
continuation?.yield(value)
}
}