🦁

Swift Concurrency②:Taskとは?

に公開

Task を一言で言うと

非同期処理を走らせるための箱

Swift Concurrency では非同期処理をタスクという単位で管理する
Task { ... } を書くと、その中身が 非同期で動く処理として OS に任される

print("A")

Task {
    print("B - start")
    try? await Task.sleep(nanoseconds: 1_000_000_000) // Taskの処理を1秒止める
    print("B - end")
}

print("C")

このコードの場合は
①A
②B - start
③C
④B - end

になる。

Taskが書かれている関数が終わってもTaskは動き続ける

func load() {
    print("start")

    Task {
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        print("done")  // 1秒後に出力
    }

    print("end")
}

結果は
①start
②end
③done

親の関数が終わってもタスクは動き続ける。

Task {
    let a = await fetchA()
    print(a)
}
Task {
    let b = await fetchB()
    print(b)
}

このように2つあったら2つとも独立して動くので、結果の管理は自分でしないといけない
この問題を解消するのが次回紹介するasync let

まとめ直し

  • Task = 非同期処理の箱(実行単位)
  • Task {} を書いた瞬間に新しい非同期処理がスタートする
  • 外側の処理とは独立して動く

次回はasync letを説明します

Discussion