作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目的是了解 Swift 5.5 的 async-await 使用的“协作线程池”,以及任务组如何自动约束并发程度:考虑以下任务组代码,并行执行 32 次计算:
func launchTasks() async {
await withTaskGroup(of: Void.self) { group in
for i in 0 ..< 32 {
group.addTask { [self] in
let value = await doSomething(with: i)
// do something with `value`
}
}
}
}
虽然我希望它会限制并发程度,但正如宣传的那样,我一次只能获得两个(!)并发任务。这比我预期的要受限制得多:
concurrentPerform
...
func launchTasks2() {
DispatchQueue.global().async {
DispatchQueue.concurrentPerform(iterations: 32) { [self] i in
let value = doSomething(with: i)
// do something with `value`
}
}
}
...我一次得到 12 个,充分利用设备(我的 6 核 i9 MacBook Pro 上的 iOS 15 模拟器),同时避免线程爆炸:
最佳答案
看起来这种奇怪的行为是模拟器的限制。如果我在我的物理 iPhone 12 Pro Max 上运行它,异步等待任务组方法会导致 6 个并发任务......
...与 concurrentPerform
基本相同行为:
包括并发程度在内的行为在物理设备上基本相同。
有人可以推断,模拟器似乎被配置为对 async-await 的约束比直接 GCD 调用所能实现的更多。但是在实际的物理设备上,异步等待任务组的行为正如人们所期望的那样。
关于ios - 具有异步等待任务组的最大线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67978028/
我是一名优秀的程序员,十分优秀!