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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- TaskGroup สำหรับการทำงานแบบขนาน
- Actors และการแยกข้อมูล, nonisolated
- Sendable และการตรวจสอบความปลอดภัยต่อเธรด