【问题标题】:Difference between DispatchQueue types in swiftswift中DispatchQueue类型之间的区别
【发布时间】:2019-03-07 09:13:09
【问题描述】:

据我了解,swift 中有 3 种类型的 DispatchQueue:

  • 主(串行)(主线程)
  • 全局(并发)(后台线程并行工作)
  • 自定义(并发或串行)

每个都可能工作(异步或同步)

第一个问题:

主队列是否仅在 UI 线程 上工作而不在另一个线程上工作? 如果答案是肯定的,DispatchQueue.Main.async 如何不阻塞 UI 线程。 如果回答否,使用DispatchQueue.global 有什么好处,只要DispatchQueue.Main.async 在另一个线程中工作。

第二个问题:

DispatchQueue.global (async)DispatchQueue.global (sync) 之间有什么区别,只要这个队列工作 并发 并且在哪里使用每一个?

第三个问题:

什么是区别

  1. (串行和同步)
  2. (并发和异步)

【问题讨论】:

    标签: swift multithreading asynchronous grand-central-dispatch dispatch-queue


    【解决方案1】:

    据我了解:

    队列不是线程

    主队列和全局队列可以在同一个线程中工作

    Dispatched:表示将任务放入队列

    如果 全局队列主队列 中作为 sync 调度,则调度的任务将在 主队列 的同一线程上工作strong> 并将分派任务添加到 全局队列而且这个任务会冻结线程

    如果 全局队列主队列 中作为 async 调度,则调度的任务将在 主队列 的其他线程上工作strong> 并将分派任务添加到 全局队列而且这个任务不会冻结线程

    如果 Main queueMain queue 中作为 async 调度,则调度的任务将在 Main queue 的同一线程上工作强>

    如果 主队列主队列 中作为同步分派,则会产生异常,因为会导致 死锁

    Dispatch.sync:将任务放入队列并等待它完成

    Dispatch.async:将任务放入队列,不等到完成(任务可能在同一个线程或另一个线程中工作)

    • 如果任务在全局队列上分派并且这符合主线程 然后任务将添加到全局队列中,新线程将 创建并且任务将立即在新线程中开始工作

    • 如果任务在主队列上调度并且这符合主线程 然后该任务将添加到主队列中,并且将不起作用 立即直到队列中的旧任务完成工作(因为 Main 队列是顺序的)

    【讨论】:

      【解决方案2】:

      DispatchQueue 不直接对应单个线程。唯一的限制是您只能从主线程访问 UI,这可以通过DispatchQueue.main 完成。但是,如果您在特定队列上调用执行块,则无法保证系统会将您的执行块分派到特定线程。

      DispatchQueue.async 是非阻塞操作,因此您可以在同一个队列上异步执行多个代码块而不会阻塞特定线程,这就是为什么您应该始终将操作异步调度到主队列,以避免阻塞 UI 更新,因为主队列只负责 UI 相关的任务。在任何队列上调用async,并不能保证执行将发生在特定线程(无论是后台线程还是主线程)上,它只保证操作将以非阻塞方式执行。

      DispatchQueue.sync 是一个阻塞操作,这意味着当单个 sync 代码块正在执行时,没有其他代码可以在特定的 DispatchQueue 上执行,所以如果你将代码块分派到 @ 987654328@ 同步队列,您将阻止 UI 更新,因此您的应用将冻结。

      【讨论】:

      • 只要 DispatchQueue.global 为 Concurrent ,与 (sync) 一起使用时如何阻塞。 并发意味着队列中的每个元素将在单独的线程中工作
      • @user3141421 没有并发DispatchQueue 这样的东西。正如我所说,您可以将执行块同步(这将是一个阻塞操作)或异步(非阻塞,这就是您所说的并发)分派到队列,但队列本身不会并发。如果队列将工作项分派给多个不同的线程,则队列可以同时执行任务,但是您可以通过同步向其分派执行块来阻塞任何队列。
      • 我不同意你的观点,根据苹果文档:调度队列可以是串行的,以便一次执行一个工作项,也可以是并发的
      • @user3141421 没错,但是并发的DispatchQueue 只意味着它具有并发执行任务的能力。这并不意味着它可以只能同时执行任务。并且同步调度任务将使并发队列表现得像一个串行队列,直到同步阻塞操作完成执行。
      • serial DispatchQueue 是否只能同步工作?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      相关资源
      最近更新 更多