0Pricing
Swift Academy · Ders

Üretici/tüketici, işlem hatları ve zaman aşımı

Basit bir üretici/tüketici oluşturun, AsyncSequence ile işlem hatlarını birleştirin ve bir uyku görevini yarıştırarak zaman aşımı uygulayın.

Üretici/tüketici, işlem hatları ve zaman aşımı, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 3 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 3 dersten oluşur.

Ne oluşturacaksınız

Bu derste üç desen gösterilmektedir:

  • Üretici/tüketici deseni: AsyncStream
  • AsyncSequence dönüşümlerini kullanan işlem hatları
  • Görevleri iş birliği içinde yarıştırarak uygulanan zaman aşımları

Temel üretici/tüketici

AsyncStream, itme tarzı üreticileri çekme tabanlı for await tüketimiyle birleştirir.

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

Geri basınç politikası

Geri basıncı yönetmek için bir bufferingPolicy seçin (en eskisini bırakma, en yenisini bırakma veya küçük akışlar için sınırsız).

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

AsyncSequence ile işlem hattı

AsyncSequence, tanıdık işleçleri (map, filter, reduce) destekler; böylece akış işlem hatlarını anlaşılır biçimde oluşturabilirsiniz.

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

Paralel aşama

CPU'ya bağlı dönüşümler için işlem hatlarının içinde görev grupları kullanın, ardından sonuçları tercih ettiğiniz sırada yeniden birleştirin.

// 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"]
}

Zaman aşımı yardımcısı

Zaman aşımını, işlemi bir sleep göreviyle yarıştırarak uygulayın; iş kaybını önlemek için kaybedeni cancel edin.

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

Zaman aşımı deseni (yarış)

Hızlı kontrol: Zaman aşımı eklemenin iyi bir yolu nedir?

Özet

Özet:

  • Üretici/tüketici için AsyncStream kullanın.
  • AsyncSequence işlem hatlarını map/filter/reduce ile birleştirin.
  • Görevleri yarıştırıp kaybedeni iptal ederek zaman aşımlarını uygulayın.

Sıkça Sorulan Sorular

“Üretici/tüketici, işlem hatları ve zaman aşımı” dersi ücretsiz mi?

Evet — “Üretici/tüketici, işlem hatları ve zaman aşımı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 3 dersten oluşur.

“Üretici/tüketici, işlem hatları ve zaman aşımı” dersinde ne öğreneceğim?

Basit bir üretici/tüketici oluşturun, AsyncSequence ile işlem hatlarını birleştirin ve bir uyku görevini yarıştırarak zaman aşımı uygulayın. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Swift Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 1. dersidir.

“Üretici/tüketici, işlem hatları ve zaman aşımı” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Üretici/tüketici, işlem hatları ve zaman aşımı
  2. Eski geri çağırmaları/Combine'ı async/await'e uyarlama
  3. Async kodu sınama (XCTest)
← Swift Academy Sayfasına Dön