异步序列与反压控制:实现自定义 AsyncSequence 与限流
构建支持反压(Backpressure)的自定义 AsyncSequence,包括节流、防抖、可暂停的生产者-消费者模式。 · 难度:入门 · +10XP
异步序列与反压控制:实现自定义 AsyncSequence 与限流
Swift AsyncAlgorithms 提供了组合子,但低层原理需要自己实现 AsyncIteratorProtocol 和 AsyncSequence。本教程将实现一个可暂停的生产者(通过 Task 和 AsyncStream),并进一步构建一个支持背压的序列:当消费者慢时,生产者自动降频。还会涉及 Continuation 的取消检查与 throwing 迭代器。
struct ThrottledSequence: AsyncSequence {
typealias Element = Base.Element
let base: Base
let interval: Duration
func makeAsyncIterator() -> Iterator { Iterator(base: base.makeAsyncIterator(), interval: interval) }
}
struct Iterator: AsyncIteratorProtocol {
mutating func next() async throws -> Base.Element? {
try await Task.sleep(for: interval)
return try await base.next()
}
}