0Pricing
Swift Academy · レッスン

並列処理のためのTaskGroup

withTaskGroup を使って子タスクを並列実行し、結果の到着順に反復処理します。throwing版を使った失敗処理も学びます。

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

なぜ TaskGroup なのでしょうか

TaskGroupは多くの子タスクを並列に起動し、安全に結果を収集します。グループはすべての子タスクが完了するまで終了しません。

  • group.addTaskで起動する
  • for awaitで消費する
  • エラーを伝播するにはthrowing版を使う

起動して収集する

addTaskで子タスクを起動し、for awaitを使って到着した結果を順に反復処理します。

func work(_ n: Int) async -> Int {
    try? await Task.sleep(nanoseconds: UInt64(50_000_000 * n)) // simulate delay
    return n * n
}

Task {
    let result = await withTaskGroup(of: Int.self) { group in
        for i in 1...4 {
            group.addTask { await work(i) }   // spawn child
        }
        var sum = 0
        for await value in group {            // values as they finish
            sum += value
        }
        return sum
    }
    print("sum =", result) // 1^2+2^2+3^2+4^2 = 30
}

結果を集約する

グループは結果の非同期シーケンスです。縮約またはループによって、1つの戻り値を作成します。

func sumSquares(_ n: Int) async -> Int {
    await withTaskGroup(of: Int.self) { group in
        (1...n).forEach { i in
            group.addTask { await work(i) }
        }
        return await group.reduce(0, +)   // reduce over async sequence
    }
}

Task {
    print(await sumSquares(5)) // 55
}

throwing グループ

withThrowingTaskGroupを使うと、最初のエラーを伝播できます。無駄な処理を止めるため、残りの子タスクをキャンセルします。

enum CalcError: Error { case boom(Int) }

func risky(_ i: Int) async throws -> Int {
    try await Task.sleep(nanoseconds: 30_000_000)
    if i == 3 { throw CalcError.boom(i) }
    return i
}

Task {
    do {
        let total = try await withThrowingTaskGroup(of: Int.self) { group in
            for i in 1...5 { group.addTask { try await risky(i) } }
            var sum = 0
            do {
                for try await v in group { sum += v }
                return sum
            } catch {
                // Cancel remaining children on error
                group.cancelAll()
                throw error
            }
        }
        print("total:", total)
    } catch {
        print("failed:", error) // boom(3)
    }
}

子タスクをキャンセルする

group.cancelAll()を呼び出してキャンセルを要求します。子タスクはTask.isCancelled(またはTask.checkCancellation())を確認し、速やかに終了する必要があります。

func slow(_ i: Int) async -> Int {
    for _ in 0..<5 {
        if Task.isCancelled { return -1 } // observe cancellation cooperatively
        try? await Task.sleep(nanoseconds: 20_000_000)
    }
    return i * 10
}

Task {
    let value = await withTaskGroup(of: Int.self) { group in
        for i in 1...3 { group.addTask { await slow(i) } }
        // cancel quickly (e.g., user navigated away)
        group.cancelAll()
        // Still need to drain results; cancelled children should exit fast
        var out = 0
        for await v in group { out += v }
        return out
    }
    print("after cancel, collected:", value)
}

ガイドライン

ヒント:

  • 子タスクの数が動的な場合は、タスクグループを優先します。
  • フェイルファストの動作にはthrowing版を使います。
  • キャンセル後も、結果をループしてグループを必ず最後まで処理します。
  • キャンセルにすぐ反応できるよう、子タスクは小さく保ちます。

構造化された待ち合わせの意味

確認問題: withTaskGroupによって何が保証されますか?

まとめ

まとめ: withTaskGroupを使って並列処理を起動し、到着した結果を順に反復処理します。速やかに失敗して残りをキャンセルするには、throwing版を優先します。

よくある質問

「並列処理のためのTaskGroup」レッスンは無料ですか?

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

「並列処理のためのTaskGroup」で何を学びますか?

withTaskGroup を使って子タスクを並列実行し、結果の到着順に反復処理します。throwing版を使った失敗処理も学びます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「並列処理のためのTaskGroup」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 並列処理のためのTaskGroup
  2. Actorsとデータ分離、nonisolated
  3. Sendableとスレッド安全性のチェック
← Swift Academyに戻る