Swift Academy · درس

المنتِج والمستهلك وخطوط المعالجة والمهل الزمنية

أنشئ نموذجًا بسيطًا لـ المنتِج والمستهلك ، وركّب خطوط المعالجة باستخدام AsyncSequence، ونفّذ مهلة زمنية عبر التسابق مع مهمة نوم.

الدرس 1 من 38 خطوة

المنتِج والمستهلك وخطوط المعالجة والمهل الزمنية درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.

ما ستبنيه

يوضح هذا الدرس ثلاثة أنماط:

  • المنتج/المستهلك باستخدام AsyncStream
  • مسارات المعالجة باستخدام تحويلات AsyncSequence
  • المهلات الزمنية عبر تسابق المهام بطريقة تعاونية

المنتج/المستهلك الأساسي

يربط AsyncStream بين المنتجين ذوي الأسلوب القائم على الدفع والاستهلاك القائم على السحب باستخدام for await.

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

سياسة الضغط العكسي

اختر bufferingPolicy لإدارة الضغط العكسي (إسقاط الأقدم، أو إسقاط الأحدث، أو استخدام مخزن غير محدود للتدفقات الصغيرة).

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

تدعم AsyncSequence العوامل المألوفة (map وfilter وreduce)، مما يتيح لك بناء مسارات معالجة متدفقة بوضوح.

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

مرحلة متوازية

استخدم مجموعات المهام داخل مسارات المعالجة للتحويلات التي تعتمد على وحدة المعالجة المركزية، ثم ادمج النتائج مجددًا بالترتيب الذي تفضله.

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

مساعد المهلة الزمنية

نفّذ مهلة زمنية عبر تسابق العملية مع مهمة sleep؛ وألغِ المهمة الخاسرة لتوفير العمل.

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

نمط المهلة الزمنية (التسابق)

تحقق سريع: ما الطريقة الجيدة لإضافة مهلة زمنية؟

مراجعة

مراجعة:

  • استخدم AsyncStream لنمط المنتج/المستهلك.
  • ركّب مسارات معالجة AsyncSequence باستخدام map/filter/reduce.
  • نفّذ المهلات الزمنية عبر تسابق المهام وإلغاء المهمة الخاسرة.
البدء مجانًا

تعلم Swift مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
122
الدروس
409

الأسئلة الشائعة

هل درس «المنتِج والمستهلك وخطوط المعالجة والمهل الزمنية» مجاني؟

نعم — نص درس «المنتِج والمستهلك وخطوط المعالجة والمهل الزمنية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.

ماذا ستتعلم في «المنتِج والمستهلك وخطوط المعالجة والمهل الزمنية»؟

أنشئ نموذجًا بسيطًا لـ المنتِج والمستهلك ، وركّب خطوط المعالجة باستخدام AsyncSequence، ونفّذ مهلة زمنية عبر التسابق مع مهمة نوم. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.

كم من الوقت يستغرق درس «المنتِج والمستهلك وخطوط المعالجة والمهل الزمنية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. المنتِج والمستهلك وخطوط المعالجة والمهل الزمنية
  2. الربط بين الاستدعاءات القديمة وCombine وasync/await
  3. اختبار الشيفرة غير المتزامنة (XCTest)
← العودة إلى Swift Academy