Swift Academy · Pelajaran

TaskGroup untuk pemprosesan selari

Gunakan withTaskGroup untuk menjalankan tugas anak secara selari, lelar hasil apabila tiba, dan kendalikan kegagalan dengan varian yang boleh melontar.

Pelajaran 1 daripada 38 langkah

TaskGroup untuk pemprosesan selari ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 3. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 3 pelajaran.

Mengapa TaskGroup?

TaskGroup melancarkan banyak tugas anak secara selari dan mengumpulkan hasil dengan selamat. Kumpulan itu hanya selesai apabila semua anak selesai.

  • Hasilkan dengan group.addTask
  • Gunakan dengan for await
  • Gunakan varian yang melontarkan ralat untuk perambatan ralat

Hasilkan dan kumpulkan

Hasilkan anak dengan addTask dan ulangi hasil apabila hasil itu 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
}

Gabungkan hasil

Kumpulan ialah jujukan async hasil; gunakan reduce atau gelung untuk membina satu nilai pulangan.

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
}

Kumpulan yang melontarkan ralat

Gunakan withThrowingTaskGroup untuk merambatkan ralat pertama; batalkan anak yang selebihnya untuk menghentikan kerja yang membazir.

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

Batalkan anak

Panggil group.cancelAll() untuk meminta pembatalan. Anak patut menyemak Task.isCancelled, atau Task.checkCancellation(), dan keluar dengan segera.

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

Garis panduan

Petua:

  • Utamakan kumpulan tugas apabila bilangan anak berubah-ubah.
  • Gunakan varian yang melontarkan ralat untuk tingkah laku gagal pantas.
  • Sentiasa kosongkan kumpulan, iaitu ulangi hasil, walaupun selepas pembatalan.
  • Pastikan tugas anak kecil supaya pembatalan dapat bertindak balas dengan pantas.

Semantik penyertaan berstruktur

Semakan ringkas: Apakah yang dijamin oleh withTaskGroup?

Imbas kembali

Imbas kembali: Gunakan withTaskGroup untuk menghasilkan kerja selari, mengulangi hasil apabila tiba, dan utamakan varian yang melontarkan ralat untuk gagal pantas serta membatalkan kerja yang selebihnya.

Percuma untuk bermula

Pelajari Swift dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
122
Pelajaran
409

Soalan Lazim

Adakah pelajaran “TaskGroup untuk pemprosesan selari” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “TaskGroup untuk pemprosesan selari”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 3 pelajaran.

Apakah yang akan saya pelajari dalam “TaskGroup untuk pemprosesan selari”?

Gunakan withTaskGroup untuk menjalankan tugas anak secara selari, lelar hasil apabila tiba, dan kendalikan kegagalan dengan varian yang boleh melontar. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 3.

Berapa lamakah pelajaran “TaskGroup untuk pemprosesan selari” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. TaskGroup untuk pemprosesan selari
  2. Actor dan pengasingan data, nonisolated
  3. Sendable dan pemeriksaan keselamatan benang
← Kembali ke Swift Academy