🏉

Swiftのスレッド関係のちょっとしたこと調査隊

2024/03/19に公開

Task async await 関係のちょっとしたことを調査する。

環境

Ventura 13.6.5
Mac mini M1
Xcode 15.2

コード

DispatchQueue.main.async {
    print("1", Thread.current)
}
print("2", Thread.current)
Task {
    print("3", Thread.current)
    DispatchQueue.main.async {
        print("4", Thread.current)
    }
    await a()
}    
print("5", Thread.current)

func a() async {
    print("6", Thread.current)
    try? await Task.sleep(nanoseconds: 1000)
    print("7", Thread.current)
}

結果

2 <_NSMainThread: 0x60000170c040>{number = 1, name = main}
5 <_NSMainThread: 0x60000170c040>{number = 1, name = main}
1 <_NSMainThread: 0x60000170c040>{number = 1, name = main}
3 <_NSMainThread: 0x60000170c040>{number = 1, name = main}
6 <_NSMainThread: 0x60000170c040>{number = 1, name = main}
4 <_NSMainThread: 0x60000170c040>{number = 1, name = main}
7 <_NSMainThread: 0x60000170c040>{number = 1, name = main}

考察

5より1が後なので2から5は一気に行く。
1より3が後なので Task {} は後回しになる
6より4が後なので async メソッドはそのまま進入する
4より7が後なので async メソッドは止まったところで後回しにする

満足

async メソッドは、頭から後回しになるのか、行けるところまで行ってから後回しにするのかを調査したかった。行けるところまで行くらしい。

さいごに

アイコンはラグビーボールにしました。ラグビーはパスを後ろに出すそうです。

理解が完全とは言えません。

  • やっていることに意味がない
  • 状況によって結果は変わる

などのつっこみがある場合はコメントお願いします。

Discussion