在 Objective-C 和 Swift 中,串行队列的异步 block 内并发调用的执行顺序是否有保证?
伪代码:
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
}
}
在上面的代码中,是否保证任务1在调用任务2之前完成?
或者,由于它们是在并发线程上调用的,串行队列异步仅保证 run_task1
将在 run_task2
之前添加到并发队列>,但不保证执行顺序?
最佳答案
我已经对您问题中的 block 进行了编号,因此我可以在这里引用它们:
block 1 和 block 3 都在串行队列上运行,因此 block 3 仅在 block 1 完成后才会运行。
但是, block 1 和 3 实际上并不等待任务 1/2,它们只是对 block 2 和 4 中异步发生的工作进行排队,这几乎立即完成。
从那时起,任务 1 和 2 将同时运行,并以任意顺序完成。唯一的保证是任务 1 将在任务 2 之前启动。
我总是喜欢用点披萨和做披萨做类比。对异步工作进行排队就像订购披萨一样。这并不意味着您可以立即准备好披萨,并且在披萨店烘烤披萨时您不会被阻止做其他事情。
您的 block 1 和 3 是强顺序的,因此 1 将在 3 开始之前完成并完成。然而,该街区所做的只是订购披萨,而且速度很快。这确实意味着披萨 1(任务 1)在披萨 2(任务 2)之前完成,这只是意味着您在调用第二个电话之前先挂断了第一个电话。
关于swift - 串行队列内的并发队列调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67219631/