为什么在第一个任务完成之前第二个任务没有开始? (并发队列)

问题描述 投票:0回答:1

并发调度队列:

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 个问题。

  1. 为什么并发队列返回这样的结果?
  2. DispatchQueue中的
    label
    对结果有影响吗?
swift concurrency dispatch-async dispatch-queue
1个回答
0
投票

分派的工作不需要足够长的时间来体验并发行为。第一个可能运行得太快,以至于在第二个有机会开始之前就完成了。 (事实上,

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 的对比,但您可以清楚地看到它们并行运行。

并且,在回答您的问题时,不,标签的选择并不重要。仅用于诊断目的。

© www.soinside.com 2019 - 2024. All rights reserved.