并发调度队列:
func myConcurrentQueue() {
let concurrentQueue = DispatchQueue(label: "concurrent", attributes: .concurrent)
concurrentQueue.async {
print("Task 1 Con Start")
print("Task 1 Con Finished")
}
concurrentQueue.async {
print("Task 2 Con Start")
print("Task 2 Con Finished")
}
}
myConcurrentQueue()
我猜结果应该是:
Task 1 Con Start
Task 2 Con Start
Task 1 Con Finished
Task 2 Con Finished
但是结果如下图所示
因此,我遇到了上述问题中的 2 个问题。
label
对结果有影响吗?分派的工作不需要足够长的时间来体验并发行为。第一个可能运行得太快,以至于在第二个有机会开始之前就完成了。 (事实上,
print
输出是同步的,加剧了这种情况。)尝试插入一个Thread.sleep(…)
(你永远不会在生产代码中这样做,但对于诊断目的很有用)或一些耗时的东西。
例如:
func myConcurrentQueue() {
let concurrentQueue = DispatchQueue(label: "concurrent", attributes: .concurrent)
let start = ContinuousClock().now
concurrentQueue.async {
print("Task 1 Con Start at", start.duration(to: .now))
Thread.sleep(forTimeInterval: 1)
print("Task 1 Con Finished at", start.duration(to: .now))
}
concurrentQueue.async {
print("Task 2 Con Start at", start.duration(to: .now))
Thread.sleep(forTimeInterval: 1)
print("Task 2 Con Finished at", start.duration(to: .now))
}
}
我可能建议包含一些信息来显示有关何时生成输出的信息(因此我在上面使用了
ContinuousClock
)。
无论如何,这会产生类似的结果:
Task 1 Con Start at 0.001328375 seconds
Task 2 Con Start at 0.001392083 seconds
Task 2 Con Finished at 1.006529791 seconds
Task 1 Con Finished at 1.006475916 seconds
您无法保证任务 1 与任务 2 的对比,但您可以清楚地看到它们并行运行。
并且,在回答您的问题时,不,标签的选择并不重要。仅用于诊断目的。