串行队列中的并发队列调用?

Concurrent queue calls inside serial queue?

在Objective-C和Swift中,是否可以保证在串行队列的异步块内进行的并发调用的执行顺序?

伪代码:

let serialQueue = SerialQueue()
let concurrentQueue = ConcurrentQueue()

serialQueue.async { // 1
    concurrentQueue.async { // 2
        run_task1() // task that takes 1 hour
    }
}

serialQueue.async { // 3
    concurrentQueue.async { // 4
        run_task2() // task that takes 1 minute
    }
}

在上面的代码中,是否保证task1在调用task2之前完成?

或者因为它们是在并发线程上调用的,所以串行队列异步仅保证 run_task1 添加run_task2 之前的并发队列,但不保证执行顺序?

我已经对你问题中的区块进行了编号,所以我可以在这里引用它们:

块 1 和块 3 都在 运行 串行队列上,因此块 3 只会 运行 一旦 1 完成。

但是,块 1 和块 3 实际上并不等待 task1/2,它们只是将工作排队等待在块 2 和块 4 中异步发生,几乎立即完成。

从那时起,任务 1 和任务 2 将同时 运行ning,并以任意顺序完成。唯一的保证是 task1 将在 task2 之前开始。


我总是喜欢用订购披萨和制作披萨的比喻。排队异步工作就像订购比萨饼。这并不意味着您可以立即准备好比萨饼,也不会在比萨饼店烤比萨饼时阻止您做其他事情。

您的块 1 和块 3 是严格排序的,因此 1 将完成并在 3 开始之前完成。但是,该街区所做的只是订购披萨,而且速度很快。它确实意味着比萨饼 1(任务 1)在比萨饼 2(任务 2)之前完成,这只是意味着您在进行第二个之前先完成了第一个 phone 呼叫。