並列処理のための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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 並列処理のためのTaskGroup
- Actorsとデータ分離、nonisolated
- Sendableとスレッド安全性のチェック