标签: asyncsequence

TaskGroup 限制大量任务的内存使用量

我正在尝试使用现代 Swift Concurrency 构建分块文件上传机制。有一个流式文件读取器,我用它来逐块读取 1mb 大小的文件。它有两个闭包nextChunk: (DataChunk) -> Voidcompletion: () - VoidInputStream第一个被调用的次数与从块大小读取的数据一样多。

为了使该阅读器兼容 Swift Concurrency,我进行了扩展并创建了AsyncStream 似乎最适合这种情况的扩展。

public extension StreamedFileReader {
    func read() -> AsyncStream<DataChunk> {
        AsyncStream { continuation in
            self.read(nextChunk: { chunk in
                continuation.yield(chunk)
            }, completion: {
                continuation.finish()
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用它,AsyncStream我迭代地读取一些文件并进行如下网络调用:

func process(_ url: URL) async {
    // ...
    do {
        for await chunk in reader.read() {
            let request = // ...
            _ = try await service.upload(data: chunk.data, request: …
Run Code Online (Sandbox Code Playgroud)

async-await swift structured-concurrency asyncstream asyncsequence

2
推荐指数
1
解决办法
1214
查看次数