Go Academy · درس

أنماط Fan-in وFan-out

دمج قنوات متعددة وتوزيع العمل

الدرس 3 من 413 خطوة

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

ما هو Fan-out؟

يوزّع Fan-out العمل من قناة واحدة على عدة goroutine، ما يتيح المعالجة المتوازية. ويستقبل كل عامل من قناة الإدخال نفسها.

مثال على Fan-out

شغّل N من العمال، بحيث يقرأ جميعهم من قناة jobs مشتركة:

func fanOut(jobs <-chan Job, n int) {
    for i := 0; i < n; i++ {
        go func() {
            for job := range jobs {
                process(job)
            }
        }()
    }
}

ما هو Fan-in؟

يدمج Fan-in عدة قنوات في قناة واحدة، بحيث يتمكن مستهلِك واحد من قراءة النتائج من منتجين متعددين.

Fan-in باستخدام goroutine

شغّل goroutine لكل قناة إدخال؛ ثم تجعل كل goroutine القيم تمر إلى قناة إخراج مشتركة.

func fanIn(cs ...<-chan int) <-chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    for _, c := range cs {
        wg.Add(1)
        go func(ch <-chan int) {
            defer wg.Done()
            for v := range ch { out <- v }
        }(c)
    }
    go func() { wg.Wait(); close(out) }()
    return out
}

Fan-in باستخدام select

بالنسبة إلى عدد ثابت من قنوات الإدخال، تكون حلقة select أبسط من استخدام goroutine لكل قناة.

func merge(a, b <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for a != nil || b != nil {
            select {
            case v, ok := <-a: if !ok { a = nil } else { out <- v }
            case v, ok := <-b: if !ok { b = nil } else { out <- v }
            }
        }
    }()
    return out
}

مرحلة من خط الأنابيب

ادمج Fan-out وFan-in لبناء مرحلة من خط أنابيب: قناة إدخال واحدة، وN من العمال المتوازيين، وقناة إخراج واحدة مدمجة.

func parallelStage(in <-chan Work, n int) <-chan Result {
    outs := make([]<-chan Result, n)
    for i := 0; i < n; i++ {
        outs[i] = worker(in)
    }
    return fanIn(outs...)
}

إغلاق القنوات بطريقة نظيفة

يغلق المُرسِل القناة؛ ويكتشف المستقبِل الإغلاق باستخدام صيغة الاستقبال ذات القيمتين أو من خلال التكرار على القناة. لا تغلق القناة من جهة المستقبِل أبدًا.

for v := range in { // exits when in is closed
    process(v)
}

التنسيق باستخدام WaitGroup

استخدم sync.WaitGroup لمعرفة وقت انتهاء جميع عمال Fan-out، ثم أغلق قناة الإخراج حتى يتمكن المستهلِكون اللاحقون من الانتهاء.

الضغط العكسي

استخدم قنوات ذات مخزن مؤقت بين مراحل خط الأنابيب لامتصاص الدفعات المفاجئة. حدّد حجم المخزن المؤقت استنادًا إلى الفرق المتوقع في زمن الانتظار بين المنتِج والمستهلِك.

out := make(chan Result, 100) // buffer absorbs bursts

تمرير الأخطاء

غلّف النتائج في بنية تحمل القيمة والخطأ معًا، حتى تمر الأخطاء عبر خط الأنابيب بجانب البيانات من دون التسبب في panic.

type Result struct {
    Value int
    Err   error
}

إلغاء السياق

مرّر سياقًا عبر مراحل خط الأنابيب، وتحقق من ctx.Done() في كل مرحلة حتى يتوقف خط الأنابيب بأكمله عند إلغائه.

case <-ctx.Done():
    return ctx.Err()

تحقق سريع

في نمط Fan-in، ما الذي يغلق قناة الإخراج المدمجة؟

مراجعة: Fan-in وFan-out

النقاط الأساسية:

  • Fan-out: يقرأ عدة عمال من قناة واحدة
  • Fan-in: تدمج goroutine واحدة لكل مصدر المصادر في قناة إخراج واحدة
  • ينسّق WaitGroup إغلاق القناة المدمجة
  • استخدم السياق للإلغاء؛ والقنوات ذات المخزن المؤقت للضغط العكسي
البدء مجانًا

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

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

الدورات
51
الدروس
203

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

هل درس «أنماط Fan-in وFan-out» مجاني؟

نعم — نص درس «أنماط Fan-in وFan-out» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «أنماط Fan-in وFan-out»؟

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

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

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

كم من الوقت يستغرق درس «أنماط Fan-in وFan-out»؟

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

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

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

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

  1. عبارة select
  2. المهلات والمؤقتات
  3. أنماط Fan-in وFan-out
  4. نمط مجموعة العمال
← العودة إلى Go Academy