异步序列组合子与背压控制
实现一套AsyncSequence组合子(merge、zip、buffer)并集成自定义背压策略防止数据堆积 · 难度:入门 · +10XP
异步序列组合子与背压控制
Swift的AsyncSequence提供了异步迭代能力,但缺少高级组合子。本教程构建AsyncMergeSequence、AsyncZipSequence与AsyncBufferedSequence,并引入基于令牌桶的背压控制,确保消费者与生产者速率匹配。
struct AsyncBufferedSequence<Base: AsyncSequence>: AsyncSequence {
typealias Element = Base.Element
let base: Base
let maxBuffer: Int
struct Iterator: AsyncIteratorProtocol {
var buffer: [Element] = []
var baseIterator: Base.AsyncIterator
mutating func next() async throws -> Element? {
while buffer.isEmpty, let new = try await baseIterator.next() {
buffer.append(new)
if buffer.count >= maxBuffer { break }
}
return buffer.isEmpty ? nil : buffer.removeFirst()
}
}
}