TaskGroup do wykonywania równoległego
Używaj withTaskGroup do równoległego uruchamiania zadań potomnych, iteruj po wynikach w miarę ich napływania i obsługuj błędy za pomocą wariantu zgłaszającego błędy.
TaskGroup do wykonywania równoległego to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 1 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 3 lekcji w sumie.
Po co TaskGroup
TaskGroup uruchamia równolegle wiele zadań podrzędnych i bezpiecznie zbiera wyniki. Grupa kończy działanie dopiero po zakończeniu wszystkich zadań podrzędnych.
- Twórz zadania za pomocą group.addTask
- Iteruj po wynikach za pomocą for await
- Użyj wariantu throwing do propagowania błędów
Uruchamianie i zbieranie wyników
Uruchamiaj zadania podrzędne za pomocą addTask i iteruj po wynikach w miarę ich napływania, używając 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
}Agregowanie wyników
Grupa jest asynchroniczną sekwencją wyników; użyj redukcji lub pętli, aby zbudować pojedynczą wartość zwracaną.
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
}Grupy zgłaszające błędy
Użyj withThrowingTaskGroup, aby propagować pierwszy błąd; anuluj pozostałe zadania podrzędne, aby zatrzymać niepotrzebną pracę.
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)
}
}Anulowanie zadań podrzędnych
Wywołaj group.cancelAll(), aby zażądać anulowania. Zadania podrzędne powinny sprawdzać Task.isCancelled (lub Task.checkCancellation()) i szybko kończyć działanie.
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)
}Wskazówki
Wskazówki:
- Preferuj grupy zadań, gdy liczba zadań podrzędnych jest dynamiczna.
- Używaj wariantu throwing, aby szybko reagować na błędy.
- Zawsze opróżniaj grupę, iterując po wynikach, nawet po anulowaniu.
- Utrzymuj zadania podrzędne jako małe, aby anulowanie było szybko obsługiwane.
Semantyka strukturalnego oczekiwania na zakończenie
Szybkie sprawdzenie: Co gwarantuje withTaskGroup?
Podsumowanie
Podsumowanie: Używaj withTaskGroup do uruchamiania pracy równoległej i iterowania po wynikach w miarę ich napływania. Preferuj wariant throwing, aby szybko reagować na błędy i anulować pozostałe zadania.
Często zadawane pytania
Czy lekcja „TaskGroup do wykonywania równoległego” jest bezpłatna?
Tak — pełny tekst „TaskGroup do wykonywania równoległego” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 3 lekcji w sumie.
Co nauczysz się w „TaskGroup do wykonywania równoległego”?
Używaj withTaskGroup do równoległego uruchamiania zadań potomnych, iteruj po wynikach w miarę ich napływania i obsługuj błędy za pomocą wariantu zgłaszającego błędy. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 3.
Ile czasu zajmuje lekcja „TaskGroup do wykonywania równoległego”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- TaskGroup do wykonywania równoległego
- Aktory i izolacja danych, nonisolated
- Sendable i sprawdzanie bezpieczeństwa wątkowego