什么会导致相同代码的不同输出?

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

为什么这段代码在 Xcode 和 Swift Playground 中运行时会产生不同的输出?

           for i in 0...10 {
                DispatchQueue.global().async {
                    DispatchQueue.global().sync {
                        print("Print1",i)
                    }
                    print("Print2",i)
                }
            }

Swift Playground 输出: 打印1 0 打印1 1 打印1 4 打印1 2 打印1 5 打印1 3 打印1 7 打印1 6 打印1 8 打印1 9 打印1 10 打印2 10 打印2 4 打印2 2 打印2 6 打印2 1 打印2 3 打印2 8 打印2 5 打印2 7 打印2 0 打印2 9

Xcode 输出: 打印1 0 打印2 0 打印1 2 打印1 3 打印1 4 打印2 4 打印1 6 打印2 6 打印1 8 打印2 8 打印1 10 打印2 10 打印2 2 打印2 3 打印1 5 打印2 5 打印1 9 打印2 9 打印1 7 打印2 7 打印1 1 打印2 1

我在不同平台上运行,结果都是一样的。

swift xcode grand-central-dispatch swift-playground
1个回答
0
投票

调用

DispatchQueue.global().async
将您传递的闭包添加到全局并发调度队列。

您可以将全局并发调度队列视为操作系统的作业 jar。操作系统正在管理设备上所有不同 CPU 核心上的任务。当操作系统运行时,不同的 CPU 核心变得可用,操作系统进入“作业 jar”并提取任务,将其交给其中一个核心来执行。哪个核心获得哪个工作是不可预测的,因为它取决于系统上正在发生的其他事情。同样,每个任务可能需要不同的运行时间,具体取决于它在完成之前是否被中断(以及各种其他因素)。

这就是为什么当您在应用程序中运行代码时,打印语句以随机顺序显示。每次运行应用程序时,打印语句都会以不同的顺序显示。

您列出的输出在游乐场和从应用程序运行时都是半随机顺序的。

您列出的 Swift Playground 输出将 print1 输出显示为 0, 1, 4, 2, 5, 3, 7, 6, 8, 9, 10, print2 输出显示为 10, 4, 2, 6, 1, 3, 8, 5, 7, 0, 9.

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