串行队列中的并发队列调用?
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 呼叫。
在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 呼叫。