swift - Swift Group Tasks 未并行运行
问题描述
问题:
- 为什么组任务不并行运行?
- 我错过了什么还是这是一个错误?
输出:
started 24
finished 24
--- 24
started 12
finished 12
--- 12
started 16
finished 16
--- 16
started 4
finished 4
--- 4
started 10
finished 10
--- 10
started 20
finished 20
--- 20
started 19
finished 19
--- 19
环境:
- macOS 11.5.2 (20G95)
- Xcode 版本 13.0 测试版 5 (13A5212g)
- SwiftUI 项目
代码:
func groupTask() async -> [Int : Int] {
let ids = [24, 12, 16, 4, 10, 20, 19]
var prices = [Int : Int]()
for id in ids {
await withTaskGroup(of: (Int, Int).self) { group in
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
}
解决方案
为什么组任务不并行运行?
您有await withTaskGroup
内部 for-in,因此您的代码在每次迭代时等待组任务完成。
你可能想做这样的事情?
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
}
推荐阅读
- python - 外部网页将我发送到 Apache 欢迎页面而不是 Flask 应用程序
- asp.net - 事件查看器中的 ASP.NET 2.0 System.AccessViolationException
- javascript - 如何不使用 array.forEach(_ => count++) 计算 array.push(undefined)?
- java - graphql 和 Spring Boot 上下文的问题
- python - 嵌套的 For 循环很快停止(初学者)
- javascript - React Router 是否有 onLoad 函数
- scala - 如何在解析的json中获取整数而不是浮点数
- javascript - 如何制作小标题?
- java - ClassLoader.loadLibrary NullPointerException 运行测试
- node.js - 使用 redis 和 hapi 构建 API