【问题标题】:How does quality of service (QOS) change when a dispatchWorkItem of higher QOS is added to a dispatchQueue of lower QOS?将较高 QOS 的 dispatchWorkItem 添加到较低 QOS 的 dispatchQueue 时,服务质量 (QOS) 有何变化?
【发布时间】:2020-06-09 04:47:57
【问题描述】:

我找到了有关如何为操作和操作队列提升 QOS 的文档: https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html

但是还没有找到任何关于 dispatchQueues 的信息。分配 QOS 的方式有以下三种:

  1. 到 DispatchQueue 本身

  2. 当我们将任务分派到 dispatchQueue 时: func async(group: DispatchGroup?, qos: DispatchQoS, flags : DispatchWorkItemFlags, execute: () -> Void)

  3. 我们可以将 QOS 分配给 dispatchWorkItem 本身

我想知道当这些QOS不同时,QOS是如何提升的。

【问题讨论】:

  • 参见here讨论部分

标签: swift grand-central-dispatch qos


【解决方案1】:

您已经概述了指定服务质量 (QoS) 的三种方法。但后两者其实是一样的,只是一个是使用blocks,另一个是DispatchWorkItem。所以我们重点关注这两个 QoS 维度,队列的和分派任务的。

简而言之,队列 QoS 优先于调度项的 QoS,除非:

  • 您根本没有为队列指定 QoS(例如,它的 QoS 是.unspecified);或
  • 您确实指定了队列 QoS,但您调度了一个带有.enforceQoS 标志的任务(只要“这样做不会降低服务质量”,该任务的 QoS 优先于队列的 QoS)。

坦率地说,大多数时候,我们只是设置队列 QoS 并收工。它清晰、简洁,并且很容易推理我们的代码。可以在任务级别指定 QoS,但不太常见。并且为队列和分派项目指定 QoS 并使用 .enforceQoS 标志覆盖 QoS 是非常不寻常的。

有关一般 QoS 的更多信息,请参阅 WWDC 2015 Building Responsive and Efficient Apps with GCD 和 WWDC 2016 Concurrent Programming With GCD in Swift 3。第一个视频向我们介绍了 QoS(正如您所看到的,当他们介绍这个主题时,重点是在调度队列中),但是这个视频无可否认地使用了旧的 Swift 2 语法,尽管概念没有改变。第二个视频向我们介绍了当代 Swift 语法,并简要回顾了之前视频的许多讨论。

有各种有趣(和不寻常)的边缘情况(例如 GCD 对优先级反转的处理),但这已在上述视频中进行了讨论,超出了本问题的范围。

【讨论】:

  • 感谢您提供信息和链接!
猜你喜欢
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多