Task 的行为在 Playground 环境中似乎有所不同

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

在实际的应用项目中,运行以下代码时,打印语句的顺序是1->3->2:

var body: some View {
    Text
    .onAppear {
        print("1")
        Task {
            print("2")
        }
        print("3")
    }
}

但是,在 Playground 中执行等效代码时,打印语句按照 1->2->3 的顺序出现:

print("1")
Task {
    print("2")
}
print("3")

在 Playground 环境中进行多次测试后,我观察到在 mainActor 上运行 Task 内的函数或显着降低 Task 的优先级(例如 .background)会导致 1->3->2 的顺序:

print("1")
Task { @MainActor in
    print("2")
}
print("3")

// or
print("1")
Task(priority: .background) {
    print("2")
}
print("3")

但是,如果没有这些额外的配置,我相信 Playground 中的打印顺序也应该是 1->3->2。

您能解释一下为什么在 Playground 中执行顺序是 1->2->3 吗?

ios xcode concurrency task
1个回答
0
投票

这是因为在应用程序项目中你的代码实际上是这样开始的:

@main // Magic here!
struct ExampleSwiftUIApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

因此,应用程序项目中的

Task
代表当前参与者(此处为 main)运行。因此代码的执行就像在主队列上一样。主队列是串行,因此在应用示例中保证顺序 1->3->2。

现在让我们看一下 in-Playground- 示例。在这里,您正在创建没有演员的任务。没有参与者的任务与基本代码流同时运行。在您的示例中,基本流量为

print("3")

。是的,
print("3")
 在主线程上运行。但。没有主角,所以我相信在游乐场

Task { print("2") }
产生

独立任务。因此,2

 vs 
3
 的执行顺序无法保证,可能取决于优先级、可用 CPU 核心数量等。

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