【问题标题】:In GCD, when do I use a global concurrent queue vs a custom concurrent queue?在 GCD 中,何时使用全局并发队列与自定义并发队列?
【发布时间】:2019-01-16 03:49:18
【问题描述】:

在 GCD 中,有两种方法可以同时运行块。

我可以使用其中一个全局池:

DispatchQueue.global().async() {
  // do work
}

或者我可以创建自己的队列:

let queue = DispatchQueue(label: "process images", attributes: [.concurrent])
queue.async {
  // do work
}

但我找不到太多关于何时更喜欢其中一个的信息。

有些地方(包括 this libdispatch 维护者的邮件列表帖子摘要)建议您真的不应该使用全局队列。

然而大多数代码示例只是调度到一个全局队列,甚至有一些消息来源说你真的不应该使用 custom 队列 - 而应该更喜欢 global排队。

哪种情况更适合每种队列?与此相关的是,一些文章建议优先使用串行队列而不是并发队列 - 但显然它们具有完全不同的并行特性,因此看到它们被建议为可互换是很奇怪的。

【问题讨论】:

  • 看到这个话题是有争议的,但问题是如果你执行的任务较少,那么你可以使用全局队列,系统也使用全局队列。您可能使用自己的自定义队列的情况是,如果您正在设计一个框架或一个管理器类,您可能会在其中处理更多的任务队列。

标签: ios macos grand-central-dispatch


【解决方案1】:

除了担心效率和线程爆炸,有了自己的并发队列,你可以:

  • 指定对您有意义的调试标签
  • 暂停
  • 设置和获取特定于应用的数据
  • 提交障碍任务

对于全局并发队列,这些都不可能。

【讨论】:

  • 感谢您的回复!总是使用自定义当前队列有什么缺点吗?
  • 我不知道。
  • 好吧,Apple 说如果没有必要,我们应该避免使用自定义并发队列:Avoiding Excessive Thread Creation
猜你喜欢
  • 2013-10-11
  • 2020-01-02
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2017-06-27
  • 1970-01-01
相关资源
最近更新 更多