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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 構造化並行性とasync関数
- async let、Task、キャンセル
- try awaitとエラーの伝播