0Pricing
Swift Academy · Pelajaran

TaskGroup untuk paralelisme

Gunakan withTaskGroup untuk menjalankan tugas anak secara paralel, iterasikan hasil saat hasil tersebut tiba, dan tangani kegagalan dengan varian yang dapat melempar galat.

TaskGroup untuk paralelisme adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 3 pelajaran total.

Mengapa TaskGroup?

TaskGroup menjalankan banyak tugas anak secara paralel dan mengumpulkan hasilnya dengan aman. Grup hanya selesai setelah semua anak selesai.

  • Buat dengan group.addTask
  • Konsumsi dengan for await
  • Gunakan varian pelempar kesalahan untuk meneruskan kesalahan

Menjalankan dan mengumpulkan

Jalankan tugas anak dengan addTask dan iterasikan hasilnya saat hasil tersebut tiba menggunakan 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
}

Menggabungkan hasil

Grup merupakan urutan asinkron hasil; gunakan reduce atau perulangan untuk membentuk satu nilai hasil.

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
}

Grup yang melempar kesalahan

Gunakan withThrowingTaskGroup untuk meneruskan kesalahan pertama; batalkan anak-anak yang tersisa untuk menghentikan pekerjaan yang sia-sia.

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)
    }
}

Membatalkan anak

Panggil group.cancelAll() untuk meminta pembatalan. Anak-anak harus memeriksa Task.isCancelled atau Task.checkCancellation(), lalu segera berhenti.

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)
}

Panduan

Tips:

  • Utamakan grup tugas ketika jumlah anak bersifat dinamis.
  • Gunakan varian pelempar kesalahan untuk perilaku yang segera gagal.
  • Selalu kosongkan grup dengan mengiterasikan hasil, bahkan setelah pembatalan.
  • Jaga agar tugas anak tetap kecil sehingga pembatalan dapat segera ditanggapi.

Semantik penggabungan terstruktur

Pemeriksaan singkat: Apa yang dijamin oleh withTaskGroup?

Ringkasan

Ringkasan: Gunakan withTaskGroup untuk menjalankan pekerjaan paralel, mengiterasikan hasil saat tiba, dan mengutamakan varian pelempar kesalahan agar kegagalan terjadi segera serta tugas lainnya dibatalkan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “TaskGroup untuk paralelisme” gratis?

Ya — teks lengkap “TaskGroup untuk paralelisme” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “TaskGroup untuk paralelisme”?

Gunakan withTaskGroup untuk menjalankan tugas anak secara paralel, iterasikan hasil saat hasil tersebut tiba, dan tangani kegagalan dengan varian yang dapat melempar galat. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 3.

Berapa lama pelajaran “TaskGroup untuk paralelisme” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. TaskGroup untuk paralelisme
  2. Actor dan isolasi data, nonisolated
  3. Sendable dan pemeriksaan keamanan thread
← Kembali ke Swift Academy