具有异步等待任务组的最大线程数

2024-03-26

我的目的是了解 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 = doSomething(with: i)
                // do something with `value`
            }
        }
    }
}

虽然我希望它会限制并发程度,但正如所宣传的那样,我一次只能获得两个(!)并发任务。这比我预期的要受限得多:

如果我使用旧的GCDconcurrentPerform ...

func launchTasks2() {
    DispatchQueue.global().async {
        DispatchQueue.concurrentPerform(iterations: 32) { [self] i in
            let value = doSomething(with: i)
            // do something with `value`
        }
    }
}

...我一次获得十二个,充分利用设备(我的 6 核 i9 MacBook Pro 上的 iOS 15 模拟器),同时避免线程爆炸:

(FWIW,这两个都在 Big Sur 上运行的 Xcode 13.0 beta 1 (13A5154h) 中进行了分析。请忽略这两次运行中各个“作业”的细微差别,因为相关函数只是在随机持续时间内旋转;关键的观察是并发程度是我们所期望的。)

非常好的是这个新async-await(和任务组)自动限制并行度,但是协作线程池async-await比我预想的要受限得多。我认为没有办法调整该池的这些参数。我们如何才能更好地利用我们的硬件,同时仍然避免线程爆炸(不诉诸非零信号量或操作队列等旧技术)?


模拟器上协作线程池的这种限制已在 Xcode 14.3 中删除(在发行说明 https://developer.apple.com/documentation/xcode-release-notes/xcode-14_3-release-notes).


看起来这种奇怪的行为是 Xcode 14.2 及更早版本中模拟器的限制。如果我在物理 iPhone 12 Pro Max 上运行它,异步等待任务组方法会产生 6 个并发任务......

...本质上与concurrentPerform行为:

行为(包括并发程度)在物理设备上本质上是相同的。

我们可以推断,模拟器似乎被配置为比直接 GCD 调用可实现的更多限制 async-await。但在实际的物理设备上,异步等待任务组的行为正如人们所期望的那样。


无论如何,以上内容是由 MacBook Pro 上的 Xcode 13 生成的。我在 Xcode 14.2 中重复了这两台不同的 Mac,并得到了不同的结果。具体来说,在我的 Intel 2018 MacBook Pro 上,模拟器的协作线程池有两个线程。不过,在我的 2022 Mac Studio 模拟器上,它被限制为 3 个线程:

看来模拟器的协作线程池的大小受到您使用的 Mac 硬件的影响。但重点仍然是,协作线程池是人为地限制在模拟器上的。


为了进行比较,下面是在 Xcode 14.2 中在物理 iPhone 12 Pro Max 上运行的类似“兴趣点”:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有异步等待任务组的最大线程数 的相关文章

  • 内置点赞按钮 - Facebook SDK 3.0

    有人知道关于将 我喜欢它 按钮放入应用程序的好教程吗 我对 Facebook SDK 3 0 和所谓的内置点赞按钮特别感兴趣 到目前为止 我一直在google和stackoverflow上搜索 但没有找到任何关于SDK 3 0的信息 发布内
  • async/await 中的 return 语句在哪里

    我可能已经让自己陷入了相当不成熟的困惑之中 请参考下面的代码 控制台应用程序 namespace Tasks101 class Program static void Main string args Program p new Progr
  • UIScrollView 滚动时捕捉到位置

    我正在尝试实现一个捕捉到点的滚动视图滚动时 我在这里看到的所有帖子都是关于在用户结束拖动滚动条 之后 捕捉到某个点的 我想让它在拖动过程中折断 到目前为止 我已经用它来停止拖动后的惯性 并且效果很好 func scrollViewWillE
  • AVSpeechUtterance 最大音量非常安静且速率非常快

    我正在考虑向我的应用程序添加语音提示 并在 iOS 7 中测试 AVSpeechUtterance 但默认语音速率非常快 最低语速更容易理解 但是最大音量值1太安静了 我在 iPhone 4 上进行了测试 并将音量调到最大 一定是出了什么问
  • 检查 Objective-C 中从 JSON 字符串返回的空值

    我有一个JSON来自网络服务器的对象 日志是这样的 status success UserID 15 Name John DisplayName John Surname Smith Email email Telephone null F
  • Swift TTS,无音频输出

    我尝试在我的应用程序 TTS 中集成 但如果单击按钮 则没有音频输出 这是按钮代码 struct VocabDetailView View var body some View HStack Button Play readOut text
  • 应用程序已批准 - 等待开发人员发布 - 目前在您所在的国家/地区不可用

    我已经为 iOS 应用商店创建了一个应用程序 它已获得批准 现在正在等待我的释放 在 iTunes connect 中 我确保在可用性方面选择所有国家 地区 在我的 itunesConnect 应用程序上 如果我选择我的应用程序并点击 在
  • 为什么 UIScrollView 在顶部留有空间并且不滚动到底部

    我是 Objective C 编程新手 我正在使用 UIScrollView 及其上的一些标签 图像和文本视图 我已关闭自动布局 并已尝试打开 调整滚动视图插图 标题中描述的情况 和关闭 不滚动 这是我插入 viewDidLoad 的内容
  • valgrind 和 iOS SDK 4.2?

    使用 valgrind 运行 iOS 4 2 应用程序时遇到问题 我从 Macports 安装了 valgrind 3 6 0 SVN Xcode 3 2 5 当我修改 main 以运行 valgrind 时 我得到以下输出 Detecte
  • UIModalPresentationFormSheet 的圆角

    如果这是一个明显的问题 请原谅我 我是个相对较新的人 我有一个模态视图 我设置了自定义尺寸和圆角 void viewWillLayoutSubviews super viewWillLayoutSubviews self view supe
  • 具有多个嵌入 Segue 的 ContainerView

    有没有办法让单个 ContainerView 具有多个嵌入序列 目的是让 ContainerView 根据按下的按钮来容纳一些不同的 ViewController 一次只能看到一个 我想使用嵌入序列 以便在 Interface Builde
  • textFieldDidChangeSelection:在视图更新期间修改状态,这将导致未定义的行为

    这是我的代码 struct CustomTextField UIViewRepresentable var placeholder String Binding var text String func makeUIView context
  • 电子邮件在 ShareKit 中不起作用并且没有错误

    我正在使用 ShareKit 将 Facebook Twitter 和电子邮件共享添加到我的 iPhone 应用程序中 现在 Facebook 和 Twitter 可以使用 但电子邮件无法使用 最大的问题是没有错误或任何错误 它正常工作 但
  • 在 RealityKit 中更改对象的枢轴点

    我希望立方体仅在 z 轴正方向上缩放 现在 当我缩放它时 它总是围绕其中心缩放 因此 为此我必须更改对象的锚点 我知道在 SceneKit 中有一个可以使用的枢轴属性 在 RealityKit 中也有办法做到这一点吗 我发现了一个相当简单的
  • 如何对其中包含自定义对象的 NSMutableArray 进行排序?

    我想做的事情看起来很简单 但我在网上找不到任何答案 我有一个NSMutableArray对象 假设它们是 Person 对象 我想排序NSMutableArray通过 Person birthDate 这是一个NSDate 我认为这与这个方
  • 如何避免强制解包变量?

    我如何避免使用 执行强制解包操作 因为使用它通常是一个糟糕的选择 对于像下面这样的代码 什么是更好的选择 使用它使代码看起来更简单 并且因为 if 检查变量 被调用的永远不会为零 因此不会崩溃 我的老师向我们介绍了 bang 运算符 然后告
  • 连续调用startRecordingToOutputFileURL:

    苹果文档 https web archive org web 20140814091047 http developer apple com library ios DOCUMENTATION AVFoundation Reference
  • 应用程序因使用私有 API“commentText”而被拒绝

    我的应用程序更新刚刚被拒绝 并显示以下消息 您的应用程序使用或引用以下非公共 API 评论文本 我搜索了 StackOverflow 以了解如何使用 nm 和 otool 来检查我的库中的私有 API 但我无法让它工作 另外 我有一种轻微的
  • 从 Asp.Net Core 控制器返回 IAsyncEnumerable 和 NotFound

    返回一个控制器操作的正确签名是什么IAsyncEnumerable
  • Windows 下 iOS 开发的替代方案 [重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Windows 开发机为 iPhone 进行开发 https stackoverflow com questions 22358 how can i develop for iphone u

随机推荐

  • 当应用程序处于信息亭模式时拨打电话

    我们正在开发一款 Android 应用程序 旨在取代默认的 Android 拨号器并自行处理设备中正在进行的所有呼叫 到目前为止 该应用程序按预期工作 我们可以通过启动来处理来电和拨打电话ACTION CALL意图 但是 此应用程序旨在通过
  • JQuery 从提交函数内部提交表单

    以下是我想在 JQuery 脚本中执行的操作 在下面的提交函数 第 4 个 中 我想确定表单是否有文件输入并使用 ajax 提交 或者只是不使用 ajax 的常规表单提交 换句话说 如果表单已上传 则进行常规提交 我在下面的提交功能中写了这
  • 从 JSON 对象中删除键值对

    我下面有这个 JSON 对象 XXX 2 YYY 3 ZZZ 4 XXX 5 YYY 6 ZZZ 7 XXX 1 YYY 2 ZZZ 3 我想从 json 对象中删除 YYY 键值 以便新的 json 对象如下所示 XXX 2 ZZZ 4
  • 如何解决违反迪米特法则的问题?

    我和一位同事为我们的客户设计了一个系统 我们认为我们创建了一个漂亮简洁的设计 但我对我们引入的一些耦合遇到了问题 我可以尝试创建一个示例设计 其中包含与我们的设计相同的问题 但如果您原谅我 我将创建我们设计的摘录来支持该问题 我们正在开发一
  • 如何在 React 中触发函数之前等待 setState 完成?

    这是我的情况 在 this handleFormSubmit 上我正在执行 this setState 在 this handleFormSubmit 内部 我调用 this findRoutes 这取决于 this setState 的成
  • 找不到使用 System.Web.UI.HtmlControls 命名空间

    我尝试了各种使用方法System Web UI HtmlControls 但我没有找到任何参考 我如何使用该命名空间 转到项目的参考文献并确保 System Web 位于其中 如果没有 右键单击 添加引用 NET 然后添加 System W
  • Sublime Text 2 插件可按字母顺序对函数进行排序

    我正在我的应用程序中构建许多函数 现在我想按字母顺序排列它们 Sublime Text 2 中是否有任何函数可以自动执行此操作 应该改变这些 public function login 1 public function about pub
  • Jersey 2:过滤器和@Context注入

    我有以下问题 ContainerRequestFilter 是一个单例 但是阅读以下内容 Jaxrs 2 0 Oracle 规范 http download oracle com otn pub jcp jaxrs 2 0 fr eval
  • 使用 XDocument 加载编码为 UTF 16 的 xml

    我正在尝试使用 XDocument 方法读取 xml 文档 但当 xml 有时我收到错误 当我手动删除编码时 它工作得很好 我收到错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 我尝试搜索并找到了这里 gt 为什么包含
  • 更新ImageField时如何删除旧图像?

    我正在使用 Django 创建一个库存照片网站 我的模型中有一个 ImageField 问题是当用户更新图像字段时 原始图像文件不会从硬盘中删除 更新后如何删除旧图像 Use Django 清理 https github com un1t
  • AF_UNIX 相当于 Windows [重复]

    这个问题在这里已经有答案了 我想知道如何在 Windows 上使用类似于 Unix Domain Socket 的功能 行为是 一个进程将成为 服务器 并接收来自其他进程的连接 并且它可以保留和使用来自不同进程的连接 就像 TCP 套接字一
  • Intellij - 如何制作一个可以通过 CLI 或 Web 服务执行 IDE 操作的插件?

    我需要一些帮助来开始制作特定的 IntelliJ 插件 我想制作一个 IntelliJ 插件 这样您就可以从 CLI 或者从 Web 服务 如果更容易的话 启动 IntelliJ 操作 例如 我已经用 gradle 脚本构建了我的项目 但我
  • 顶点缓冲区对象(删除过程)opengl

    我什么时候应该调用 glDeleteBuffersARB 我应该在申请结束后做吗 我可以以某种方式自动化删除顶点缓冲区对象的过程吗 例如 smart ptr 之类的东西 绝不 你永远不应该打电话glDeleteBuffersARB 十多年来
  • 在 .NET 中使用 FB Connect / Google OAuth 登录

    我希望允许我的用户使用我的登录系统 FB Connect 或 Google Login 登录我的网站 我不想仅使用大型库 如 dotnetOpenAuth 来实现这两个选项 那么我应该如何实现这一点 其他问题 我应该如何将 FB Googl
  • ALLOWED_HOSTS 和 Django

    我尝试在生产服务器上启动 Django 1 11 项目 当我启动应用程序时 我看到以下错误 无效的 HTTP HOST 标头 bla bla bla bla bla vla com 您可能需要将 u bla bla bla bla bla
  • 如何根据 iPhone 中的文本大小动态增加按钮宽度?

    我以编程方式创建了 10 个按钮 并在按钮中设置了标题 现在我想动态增加按钮框架大小 它取决于文本 我给出了一些条件并设置了框架大小 但我如何设置确切的帧大小取决于文本 动态获取文本 我的示例代码是 float x 0 y 0 w h 20
  • 在其间至少有 X 间隙长度的区域中生成点

    我试图想出一种在给定区域 在我的例子中是一个正方形 中生成 X 个随机点的方法 造成这个问题的一件事是每个点必须距离所有其他点至少 Y 个单位 首先想到的是 在 c 中 检查新点与所有现有点之间的距离 while points Count
  • 使用虚函数而不是IF语句更快?

    我记得在网上读到过 在极低延迟的情况下 最好使用虚拟函数来代替 IF 语句 这是真的 他们基本上是说动态多态性对于速度情况更好吗 是否有用户可以分享其他 C 低延迟 怪癖 我非常怀疑单个 if else 语句会比使用虚拟函数慢 虚拟函数通常
  • Google Geocode API 经度和纬度不适用于 zip 96101

    I am using google geocode api https developers google com maps documentation geocoding intro https developers google com
  • 具有异步等待任务组的最大线程数

    我的目的是了解 Swift 5 5 使用的 协作线程池 async await 以及任务组如何自动约束并发程度 考虑以下任务组代码 并行执行 32 个计算 func launchTasks async await withTaskGroup