Producer/Consumer, Pipelines und Timeouts
Erstellen Sie einen einfachen producer/consumer , kombinieren Sie mit AsyncSequence pipelines und implementieren Sie einen timeout , indem Sie eine Sleep-Task gegen eine andere Aufgabe antreten lassen.
Producer/Consumer, Pipelines und Timeouts ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.
Was Sie erstellen werden
In dieser Lektion werden drei Muster vorgestellt:
- Producer/Consumer mit AsyncStream
- Pipelines mit Transformationen von AsyncSequence
- Timeouts durch kooperatives Gegeneinander-Ausführen von Tasks
Grundlegender Producer/Consumer
AsyncStream verbindet Producer im Push-Stil mit einer Pull-basierten for await-Verarbeitung.
// Producer pushes values; consumer iterates them asynchronously.
func makeNumbers(count: Int) -> AsyncStream<Int> {
AsyncStream { continuation in
Task {
for i in 1...count {
continuation.yield(i)
try? await Task.sleep(nanoseconds: 40_000_000) // ~40ms
}
continuation.finish()
}
}
}
Task {
let stream = makeNumbers(count: 5)
for await n in stream {
print("consume:", n)
}
print("done") // after finish()
}Backpressure-Richtlinie
Wählen Sie eine bufferingPolicy, um Backpressure zu steuern (älteste Einträge verwerfen, neueste Einträge verwerfen oder für kleine Streams unbegrenzt puffern).
// Use a limited buffering policy to avoid memory spikes.
func makeBufferedNumbers(limit: Int) -> AsyncStream<Int> {
AsyncStream(bufferingPolicy: .bufferingOldest(limit)) { cont in
Task {
for i in 1...20 {
cont.yield(i)
// Producer is fast; buffer prevents unbounded growth
}
cont.finish()
}
}
}
Task {
let s = makeBufferedNumbers(limit: 5)
for await n in s {
// Simulate a slow consumer
try? await Task.sleep(nanoseconds: 60_000_000)
print("got:", n)
}
}Pipeline mit AsyncSequence
AsyncSequence unterstützt vertraute Operatoren (map, filter, reduce), sodass Sie übersichtliche Streaming-Pipelines erstellen können.
// Compose a pipeline: map -> filter -> reduce over an AsyncSequence.
func numbers(_ n: Int) -> AsyncStream<Int> {
AsyncStream { cont in
Task {
for i in 1...n { cont.yield(i) }
cont.finish()
}
}
}
Task {
let evensSquaredSum = await numbers(10)
.map { $0 * $0 }
.filter { $0.isMultiple(of: 2) }
.reduce(0, +)
print("sum:", evensSquaredSum) // 220 (4+16+36+64+100)
}Parallele Stufe
Verwenden Sie Task-Gruppen innerhalb von Pipelines für CPU-intensive Transformationen und führen Sie die Ergebnisse anschließend in der von Ihnen bevorzugten Reihenfolge zusammen.
// Fan-out/fan-in: process items concurrently, then merge.
// Here we use a task group to transform elements in parallel.
func parallelUppercased(_ input: [String]) async -> [String] {
await withTaskGroup(of: String.self) { group in
for s in input {
group.addTask {
try? await Task.sleep(nanoseconds: 30_000_000)
return s.uppercased()
}
}
return await group.reduce(into: [String]()) { $0.append($1) }
}
}
Task {
let out = await parallelUppercased(["a","bb","ccc"])
print(out) // ["A","BB","CCC"]
}Timeout-Hilfsfunktion
Implementieren Sie ein Timeout, indem Sie die Operation gegen einen sleep-Task antreten lassen. Brechen Sie den Verlierer ab, um Arbeit zu sparen.
enum TimeoutError: Error { case timedOut }
func withTimeout<T>(
seconds: Double,
operation: @escaping () async throws -> T
) async throws -> T {
try await withThrowingTaskGroup(of: T.self) { group in
// Child 1: actual work
group.addTask { try await operation() }
// Child 2: the timer
group.addTask {
try await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
throw TimeoutError.timedOut
}
// First child to finish wins; cancel the rest
let result = try await group.next()!
group.cancelAll()
return result
}
}
// Demo
func slowFetch() async throws -> String {
try await Task.sleep(nanoseconds: 300_000_000) // 300ms
return "OK"
}
Task {
do {
let v = try await withTimeout(seconds: 0.1) { try await slowFetch() }
print("value:", v)
} catch {
print("timeout:", error) // expected
}
}Timeout-Muster (Wettlauf)
Kurzprüfung: Wie lässt sich ein Timeout sinnvoll hinzufügen?
Zusammenfassung
Zusammenfassung:
- Verwenden Sie AsyncStream für Producer/Consumer.
- Setzen Sie AsyncSequence-Pipelines mit map/filter/reduce zusammen.
- Implementieren Sie Timeouts, indem Sie Tasks gegeneinander antreten lassen und den Verlierer abbrechen.
Häufig gestellte Fragen
Ist die Lektion „Producer/Consumer, Pipelines und Timeouts“ kostenlos?
Ja — der vollständige Text von „Producer/Consumer, Pipelines und Timeouts“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.
Was lerne ich in „Producer/Consumer, Pipelines und Timeouts“?
Erstellen Sie einen einfachen producer/consumer , kombinieren Sie mit AsyncSequence pipelines und implementieren Sie einen timeout , indem Sie eine Sleep-Task gegen eine andere Aufgabe antreten lasse… Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 3.
Wie lange dauert die Lektion „Producer/Consumer, Pipelines und Timeouts“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Producer/Consumer, Pipelines und Timeouts
- Legacy-Callbacks/Combine mit async/await verbinden
- Asynchronen Code testen (XCTest)