🔥

SwiftPlaygroundでのTaskの実行順序こわい

2022/01/28に公開

(Xcode 13.2.1の)SwiftPlaygroundでTaskの実行順序調べてたら驚いた。

コード

import _Concurrency
import Foundation
print("1_0")
Task {
    print("2_0")
    Task {
        print("3_0")
        try await Task.sleep(nanoseconds: 10)
        print("3_1")
    }
    print("2_1")
}

print("1_1") // 期待としてはここが1_0のあとに呼ばれてほしい

出力は下記

1_0
2_0
1_1
2_1
3_0
3_1

"1_1"の実行前にTaskに突入しちゃってる!?しかも"1_1"に行く前に"2_1"で抜けてる...

いやそういうもんだっけ?
おちついてMainActorを書くんだ...。

import _Concurrency
import Foundation

@MainActor
struct Sample {
    func start() {
        print("1_0")
        Task {
            print("2_0")
            Task {
                print("3_0")
                try await Task.sleep(nanoseconds: 10)
                print("3_1")
            }
            print("2_1")
        }
        print("1_1")
    }
}

Task {
    await Sample().start()
}

出力は下記。ちゃんとしてる。

1_0
1_1
2_0
2_1
3_0
3_1

結論。Swift PlaygroundでTask使うときの実行順序どうなってんの?

Discussion