多个分离任务不会同时执行

use*_*472 3 swift swift-concurrency

class ViewModel: ObservableObject { }

struct ContentView: View {
    @StateObject private var model = ViewModel()

    var body: some View {
        Button("Authenticate", action: doWork)
    }

    func doWork() {
        Task.detached {
            for i in 1...10_000 {
                print("In Task 1: \(i)")
            }
        }

        Task.detached {
            for i in 1...10_000 {
                print("In Task 2: \(i)")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是https://www.hackingwithswift.com/quick-start/concurrency/whats-the-difference- Between-a-task-and-a-detached-task 中描述的代码。

由于 doWork 中的任务是分离的,我希望它们同时执行。上面的文章也是这么说的。

但是,当我运行它时,Task2 在 Task1 之后执行。
我错了吗?

Sco*_*son 5

通过将项目放入独立任务中,您可以让操作系统决定何时安排它们。显然,对于您查看的其中一次,系统决定将它们依次安排。没有什么可说的,下次您查看时,它们不会并行安排,或者第二个在第一个之前运行。

关键是你无法控制它。操作系统明天可能会做出与今天不同的决定。通过将工作放入任务中,您已将控制权交给了操作系统。

  • 添加一个具体示例:在 macOS 上的命令行应用程序中,我无法复制 OP 所看到的场景;这些任务似乎总是交叉的。但是通过 iOS 模拟器中 OP 的代码,我看到了 OP 所看到的,任务一个接一个地运行。充分利用协作线程池完全取决于调度程序,并且根据可用线程的数量和它认为需要完成的工作量,它可能会也可能不会并行运行任务。例如,如果我更改任务相对于彼此的优先级,我确实会看到它们在 sim 中交错。 (2认同)