0Pricing
Swift Academy · درس

TaskGroup للتنفيذ المتوازي

استخدم withTaskGroup لتشغيل المهام الفرعية بالتوازي، وتكرار النتائج عند وصولها، والتعامل مع الإخفاقات باستخدام الصيغة التي ترمي أخطاء.

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

لماذا TaskGroup؟

يشغّل TaskGroup العديد من المهام الفرعية بالتوازي ويجمع النتائج بأمان. ولا تنتهي المجموعة إلا عند اكتمال جميع المهام الفرعية.

  • أنشئ المهام باستخدام group.addTask
  • استهلك النتائج باستخدام for await
  • استخدم البديل الذي يرمي الأخطاء لتمرير الأخطاء

إنشاء المهام وجمع النتائج

أنشئ المهام الفرعية باستخدام 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
}

تجميع النتائج

المجموعة عبارة عن تسلسل async من النتائج؛ استخدم الاختزال أو التكرار لبناء قيمة إرجاع واحدة.

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 للتنفيذ المتوازي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.

ماذا ستتعلم في «TaskGroup للتنفيذ المتوازي»؟

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

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

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

كم من الوقت يستغرق درس «TaskGroup للتنفيذ المتوازي»؟

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

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

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

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

  1. TaskGroup للتنفيذ المتوازي
  2. العوامل وعزل البيانات وnonisolated
  3. Sendable والتحقق من أمان الخيوط
← العودة إلى Swift Academy