首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行异步任务

执行异步任务
EN

Stack Overflow用户
提问于 2019-02-07 09:00:58
回答 1查看 56关注 0票数 0

我需要帮助,以更好地理解如何在Swift中工作并发。

我有密码:

代码语言:javascript
复制
DispatchQueue.main.async {
    DispatchQueue.main.async {
        print("A")
        DispatchQueue.main.async {
            print("B")
        }
        print("C")
    }
    print("D")
}

结果:D A C B

我想"D“只是因为一个原因,第一个Dispatch块的执行由两个步骤组成:

  1. 将任务放在队列中
  2. 执行任务

它比执行print("D")花费更多的时间。是那么回事吗?

当我试验并发队列时,在其中一个例子中,我得到了下一个结果:A、D、C、B、

为什么会这样?

并发队列代码:

代码语言:javascript
复制
DispatchQueue.global(qos: .utility).async {
    DispatchQueue.global(qos: .utility).async {
        print("A")
        DispatchQueue.global(qos: .utility).async {
            print("B")
        }
        print("C")
    }
    print("D")
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-07 09:13:04

这种行为的原因是可以有许多具有相同QoS的全局队列,但是总是只有一个主队列。

您的第一个示例是可预测的-它的行为总是相同的,因为您总是将任务分配到同一个队列- main。与async一起提交的任务将异步执行(这意味着async函数将立即返回),但在当前执行的任务完成之前,新任务不会开始执行。下面是一个简化的模型来描述所发生的事情:

代码语言:javascript
复制
Task 1:
    Submit task 2
    Print "D"

Task 2:
    Print "A"
    Submit task 3
    Print "C"

Task 3:
    Print "B"

Task 1包括提交Task 2和打印材料。Task 1在主队列上运行,Task 2被添加到同一个队列中。这意味着在当前运行的任务-- Task 2 --完成执行之前,Task 1无法启动。

第二个例子有点不同。每次调用DispatchQueue.global时,都会保证得到一个具有特定QoS的队列,但它不一定是相同的队列。您分配给print("A")的队列似乎没有任何其他任务挂起,并且能够在async方法返回之前立即执行其工作。

使用以前提供的模型--如果将Task 2添加到与运行Task 1不同的队列中,则不需要等待Task 1完成执行。但是,在这种情况下,这取决于每次调用DispatchQueue.global时得到的队列,而这并不是保证的。

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

https://stackoverflow.com/questions/54569619

复制
相关文章

相似问题

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