0Pricing
Swift Academy · レッスン

async let、Task、キャンセル

async let で処理を並列実行し、独立した Task を作成して、協調的に キャンセル を処理します。

「async let、Task、キャンセル」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。

扱う内容

次のことを学びます。

  • async letで兄弟処理を開始する
  • Task { }で独立した処理単位を起動する
  • 協調的なチェックによってキャンセルに対応する

async let の基本

async letは同じスコープ内で子タスクを並列に開始します。スコープを抜ける前にawaitする必要があります。

func loadA() async -> Int { try? await Task.sleep(nanoseconds: 200_000_000); return 1 }
func loadB() async -> Int { try? await Task.sleep(nanoseconds: 200_000_000); return 2 }

Task {
    async let a = loadA()
    async let b = loadB()
    // Both start immediately; awaiting joins them
    let sum = await (a + b)
    print("sum =", sum) // 3
}

独立した Task

Task {}を使って独立したタスクを起動し、後からawait t.valueで結果を取得します。

// Create an independent task (not tied to current scope)
func fetchMessage() async -> String {
    try? await Task.sleep(nanoseconds: 150_000_000)
    return "hello"
}

let t = Task { await fetchMessage() }
Task {
    print("from Task:", await t.value)  // waits for the independent task's result
}

キャンセルの基本

キャンセルは協調的に行われます。Task.checkCancellation()(エラーをスローします)で確認するか、Task.isCancelledを読み取って早期に戻ります。

// A long-running job that checks for cancellation
enum WorkError: Error { case cancelled }

func longJob() async throws -> Int {
    var total = 0
    for i in 1...10 {
        try Task.checkCancellation()        // throws CancellationError if cancelled
        try? await Task.sleep(nanoseconds: 50_000_000)
        total += i
    }
    return total
}

let job = Task { try await longJob() }
Task {
    // Cancel after a short delay
    try? await Task.sleep(nanoseconds: 120_000_000)
    job.cancel()
    do {
        _ = try await job.value
    } catch {
        print("job cancelled")              // expected
    }
}

親から子へのキャンセル

親タスクがキャンセルされると、子タスクもそれを検知します。チェックの後、速やかに終了するようにします。

// Propagate cancellation from parent to children using async let
func part(_ id: Int) async throws -> String {
    try Task.checkCancellation()
    try? await Task.sleep(nanoseconds: 80_000_000)
    return "P\(id)"
}

Task {
    do {
        async let p1 = part(1)
        async let p2 = part(2)
        // Cancel the whole operation before awaiting
        Task.currentTask?.cancel()   // cancel self -> children see cancellation
        let out = try await [p1, p2].joined(separator: ",")
        print(out)
    } catch {
        print("parent cancelled; children stopped")
    }
}

ガイドライン

ヒント:

  • 兄弟タスクにはasync letを使い、必ず同じスコープ内でawaitします。
  • task.cancel()でキャンセルし、処理内部ではTask.checkCancellation()を呼び出します。
  • キャンセルとテストが容易になるよう、小さな非同期関数を優先します。

協調的キャンセルの動作

確認問題: 長時間実行される非同期コードは、キャンセルにどのように反応すべきでしょうか?

まとめ

まとめ: async letで兄弟タスクを開始し、Task {}で独立した処理を起動します。チェックして速やかに終了することで、協調的キャンセルを実装します。

よくある質問

「async let、Task、キャンセル」レッスンは無料ですか?

はい。「async let、Task、キャンセル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。

「async let、Task、キャンセル」で何を学びますか?

async let で処理を並列実行し、独立した Task を作成して、協調的に キャンセル を処理します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「async let、Task、キャンセル」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造化並行性とasync関数
  2. async let、Task、キャンセル
  3. try awaitとエラーの伝播
← Swift Academyに戻る