首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快速3中调度队列的优先级

快速3中调度队列的优先级
EN

Stack Overflow用户
提问于 2017-03-26 06:36:53
回答 3查看 4.6K关注 0票数 7

我读过关于Swift 3中的GCD和调度队列的教程

但是,我真的对同步执行和异步执行的顺序以及主队列和后台队列的顺序感到困惑。

我知道,如果我们使用同步,那么我们会在一个又一个地执行它们,如果我们使用异步,那么我们可以使用QoS来设置它们的优先级,但是这种情况如何?

代码语言:javascript
运行
复制
func queuesWithQoS() {
    let queue1 = DispatchQueue(label: "com.appcoda.myqueue1")
    let queue2 = DispatchQueue(label: "com.appcoda.myqueue2")

    for i in 1000..<1005 {
                print(i)
    }


    queue1.async {
        for i in 0..<5{
            print(i)
        }
    }

    queue2.sync {
        for i in 100..<105{
            print( i)
        }
    }
}

结果显示,我们忽略了异步执行。我知道queue2应该在queue1之前完成,因为它是同步执行的,但是为什么我们忽略异步执行,以及异步、同步和所谓的主队列之间的实际区别是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-26 09:03:45

你说:

结果显示,我们忽略了异步执行。..。

不,这只是意味着您没有给异步分派的代码足够的时间开始工作。

我知道queue2应该在queue1之前完成,因为它是同步执行的。

首先,queue2可能不会在queue1之前完成。只是碰巧而已。让queue2做一些慢得多的事情(例如,通过几千次迭代而不是仅仅5次循环),您将看到queue1实际上可以与queue2上的内容并行运行。只需几毫秒就能开始工作,而您非常简单的queue2上的内容在queue1上有机会开始之前就已经完成了。

第二,这种行为在技术上并不是因为它是同步执行的。只是异步需要几毫秒时间才能让它在某个工作线程上运行,而同步调用(由于我不会让您感到厌烦的优化)会更快地启动。

但是为什么我们忽略异步执行..。

我们不会“忽视”它。开始只需几毫秒。

异步、同步和所谓的主队列之间的实际区别是什么?

“异步”仅仅意味着当前线程可以继续运行,而不是等待分派的代码在其他线程上运行。“同步”意味着当前线程应该等待分派的代码完成。

“主线程”是一个不同的主题,它只是指为驱动UI而创建的主线程。在实践中,主线程是大多数代码运行的地方,基本上是运行除手动分配到某个后台队列(或为您分派的代码,例如URLSession完成处理程序)之外的所有内容。

票数 4
EN

Stack Overflow用户

发布于 2017-03-26 06:49:36

syncasync与同一个线程/队列相关。要查看差异,请运行以下代码:

代码语言:javascript
运行
复制
func queuesWithQoS() {
    let queue1 = DispatchQueue(label: "com.appcoda.myqueue1")

    queue1.async {
        for i in 0..<5{
            print(i)
        }
    }
    print("finished")

    queue1.sync {
        for i in 0..<5{
            print(i)
        }
    }
    print("finished")
}

主队列是整个用户界面(UI)运行的线程。

票数 3
EN

Stack Overflow用户

发布于 2017-03-26 07:42:17

首先,我更喜欢使用“延迟”一词,而不是关于代码执行的“忽略”,因为问题中的所有代码都是执行的。

QoS是一个枚举,第一个类表示最高优先级,最后一个表示最低优先级,当您不指定任何优先级时,您有一个具有默认优先级的队列,并且默认值位于中间:

  • userInteractive
  • userInitiated
  • 默认
  • 实用程序
  • 背景
  • 未指定

说过,您有两个同步的for-in循环和一个异步,其中优先级是根据循环的位置和代码中队列的类型(同步/异步)来确定的,因为在这里,有三个不同的队列,(按照关于链接 queuesWithQoS()的说明可以在viewDidAppear中启动,这样我们就可以假设是在主队列中)。

代码显示了两个具有默认优先级的队列的创建,因此执行的顺序如下:

  1. 1000..<1005在主队列中的输入循环
  2. 具有默认优先级的同步queue2
  3. 具有默认优先级的异步queue1 (不忽略,只是延迟)

主队列总是执行所有UI指令的最高优先级。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43025848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档