Swift TaskGroup 任务未并行运行问题排查及原因问询
原因分析
你的代码将withTaskGroup写在了遍历id的for循环内部,这是导致任务串行的核心原因,不属于系统Bug。withTaskGroup的闭包执行结束前,会等待当前组内所有任务执行完毕。你现在的写法相当于每次循环只创建一个包含单个任务的独立任务组,必须等当前组的唯一任务执行完成、组销毁后,才会进入下一次循环处理下一个id,自然没有并行效果。
解决方案
将id遍历、添加任务的逻辑移到同一个withTaskGroup闭包内部,让所有任务加入到同一个任务组中统一调度,即可实现并行执行。
修复后代码如下:
func groupTask() async -> [Int : Int] { let ids = [24, 12, 16, 4, 10, 20, 19] var prices = [Int : Int]() await withTaskGroup(of: (Int, Int).self) { group in // 所有任务一次性加入同一个任务组 for id in ids { group.addTask(priority: .background) { let price = await computePrice(for: id) return (id, price) } } // 统一接收所有任务的返回结果 for await (id, price) in group { prices[id] = price print("--- \(id)") } } return prices } func computePrice(for id: Int) async -> Int { print("started \(id)") let duration = UInt64(id * 100_000_000) await Task.sleep(duration) print("finished \(id)") return id * 2 }
修复后运行时,你会看到所有id的started打印几乎同时触发,执行耗时短的任务会优先输出完成日志,不再按id遍历顺序串行执行。
内容的提问来源于stack exchange,提问作者user1046037
相关产品推荐
相关产品推荐

