在WWDC会话中探索Swift中的 struct 化并发.有一部分是关于任务组正常退出的.
虽然任务组是 struct 化并发的一种形式,但是组任务和任务组任务的任务树规则的实现方式有很小的差异.假设在迭代这个组的结果时,我遇到了一个子任务,它完成了一个错误.由于该错误被抛出组的块,组中的所有任务将被隐式取消,然后等待.它的工作原理就像一个tax—let.
当您的组通过正常的退出块而超出范围时,区别就出现了.因此,取消并不隐含.这种行为使您更容易使用任务组来表达fork—join模式,因为作业(job)只会等待而不会被取消.您也可以在退出块之前使用组的cancelAll方法手动取消所有任务.请记住,无论您如何取消一个任务,取消都会自动沿着树向下传播.
让我们举个例子.
func fetchThumbnails(for ids: [String]) async throws -> [String: UIImage] {
var thumbnails: [String: UIImage] = [:]
try await withThrowingTaskGroup(of: (String, UIImage).self) { group in
for id in ids {
group.async {
return (id, try await fetchOneThumbnail(withID: id))
}
}
// Obtain results from the child tasks, sequentially,
// in order of completion.
for try await (id, thumbnail) in group {
thumbnails[id] = thumbnail
}
}
return thumbnails
}
这个例子中的正常出口是什么?当它达到return
时,任务组完成了所有的任务,没有什么可以取消的.请帮助我理解这一点.