0Pricing
Swift Academy · บทเรียน

TaskGroup สำหรับการทำงานแบบขนาน

ใช้ withTaskGroup เพื่อเรียกใช้งานลูกแบบขนาน วนอ่านผลลัพธ์เมื่อผลลัพธ์มาถึง และจัดการความล้มเหลวด้วยรูปแบบที่ส่งข้อผิดพลาดได้

TaskGroup สำหรับการทำงานแบบขนาน เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

เหตุใดจึงต้องใช้ TaskGroup

TaskGroupเปิดใช้งานงานลูกจำนวนมากแบบขนานและรวบรวมผลลัพธ์อย่างปลอดภัย กลุ่มจะเสร็จสิ้นก็ต่อเมื่องานลูกทั้งหมดทำงานเสร็จ

  • สร้างงานด้วย group.addTask
  • รับผลด้วย การวนรอผล
  • ใช้รูปแบบที่โยนข้อผิดพลาดสำหรับการส่งต่อข้อผิดพลาด

สร้างและรวบรวม

สร้างงานลูกด้วย 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
}

รวมผลลัพธ์

กลุ่มคือลำดับแบบไม่พร้อมกันของผลลัพธ์ ใช้ reduce หรือวนซ้ำเพื่อสร้างค่าที่ส่งกลับเพียงค่าเดียว

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
}

กลุ่มที่โยนข้อผิดพลาด

ใช้ 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)
}

แนวทาง

เคล็ดลับ:

  • ควรใช้ กลุ่มงานเมื่อจำนวนงานลูกเปลี่ยนแปลงได้
  • ใช้รูปแบบที่โยนข้อผิดพลาดเพื่อให้หยุดเมื่อพบความล้มเหลวอย่างรวดเร็ว
  • ระบายผลลัพธ์จากกลุ่มให้หมดด้วยการวนซ้ำเสมอ แม้หลังจากยกเลิกแล้ว
  • ให้งานลูกมีขนาดเล็ก เพื่อให้ตอบสนองต่อการยกเลิกได้ดี

ความหมายของการเข้าร่วมแบบมีโครงสร้าง

ตรวจสอบอย่างรวดเร็ว: withTaskGroup รับรองสิ่งใด

สรุปทบทวน

สรุปทบทวน: ใช้ withTaskGroup เพื่อสร้างงานแบบขนาน วนดูผลลัพธ์ตามที่มาถึง และควรใช้รูปแบบที่โยนข้อผิดพลาดเพื่อหยุดอย่างรวดเร็วและยกเลิกงานที่เหลือ

คำถามที่พบบ่อย

บทเรียน “TaskGroup สำหรับการทำงานแบบขนาน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “TaskGroup สำหรับการทำงานแบบขนาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “TaskGroup สำหรับการทำงานแบบขนาน”

ใช้ withTaskGroup เพื่อเรียกใช้งานลูกแบบขนาน วนอ่านผลลัพธ์เมื่อผลลัพธ์มาถึง และจัดการความล้มเหลวด้วยรูปแบบที่ส่งข้อผิดพลาดได้ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน

บทเรียน “TaskGroup สำหรับการทำงานแบบขนาน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. TaskGroup สำหรับการทำงานแบบขนาน
  2. Actors และการแยกข้อมูล, nonisolated
  3. Sendable และการตรวจสอบความปลอดภัยต่อเธรด
← กลับไปที่ Swift Academy