0Pricing
Go Academy · درس

نمط مجموعة العمال

بناء مجموعة عمال ثابتة الحجم من Goroutines

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

ما هو تجمع العمال؟

ينشئ تجمع العمال عددًا ثابتًا من goroutine مسبقًا لمعالجة المهام من قائمة انتظار مشتركة. ويحد ذلك من التزامن، مانعًا استنفاد الموارد بسبب إنشاء عدد غير محدود من goroutine.

التنفيذ الأساسي

أنشئ قناة jobs وN من goroutine التي تقرأ جميعها منها:

func workerPool(n int, jobs <-chan Job, results chan<- Result) {
    var wg sync.WaitGroup
    for i := 0; i < n; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for job := range jobs {
                results <- process(job)
            }
        }()
    }
    wg.Wait()
    close(results)
}

إرسال المهام

أرسل جميع المهام إلى القناة ثم أغلقها. سيعالج العمال جميع المهام ويخرجون من حلقات range عند إغلاق القناة.

jobs := make(chan Job, 100)
for _, j := range allJobs {
    jobs <- j
}
close(jobs) // signals workers to stop after draining

جمع النتائج

اقرأ النتائج بالتزامن مع إرسال المهام. استخدم goroutine لتشغيل التجمع حتى لا يتسبب جمع النتائج في توقف إرسال المهام بسبب التعارض.

results := make(chan Result, 100)
go workerPool(5, jobs, results)
for r := range results {
    collect(r)
}

ضبط حجم التجمع

بالنسبة إلى العمل المقيّد بوحدة المعالجة المركزية، اضبط حجم التجمع على runtime.NumCPU(). أما العمل المقيّد بعمليات الإدخال والإخراج، فمعامل أكبر (مثل 10×) يستفيد من وقت الانتظار. استخدم تحليل الأداء للعثور على النقطة المثلى.

n := runtime.NumCPU()
if ioHeavy { n = runtime.NumCPU() * 10 }

إضافة إلغاء السياق

مرّر سياقًا إلى العمال حتى يتوقفوا مبكرًا عند الإلغاء:

for {
    select {
    case job, ok := <-jobs:
        if !ok { return }
        results <- process(ctx, job)
    case <-ctx.Done():
        return
    }
}

بديل السيمافور

بدلًا من استخدام تجمع ثابت من goroutine، استخدم قناة ذات مخزن مؤقت بوصفها سيمافورًا للحد من عدد goroutine التي تعمل بالتزامن، مع الاستمرار في إنشاء goroutine لكل مهمة.

sem := make(chan struct{}, 10)
for _, job := range jobs {
    sem <- struct{}{}
    go func(j Job) {
        defer func() { <-sem }()
        process(j)
    }(job)
}

معالجة الأخطاء

أعد الأخطاء بجانب النتائج باستخدام بنية نتائج. ألغِ السياق عند حدوث الخطأ الأول، أو اجمع جميع الأخطاء لإعداد تقرير نهائي.

type Result struct{ Val int; Err error }

تغيير حجم التجمع ديناميكيًا

بالنسبة إلى التجمعات التكيفية، استخدم golang.org/x/sync/semaphore الذي يتيح الحصول على مورد موزون وتحريره، ويدعم حدود التزامن الديناميكية.

تجمع العمال مقابل errgroup

يوفر golang.org/x/sync/errgroup واجهة برمجة أبسط لتشغيل N من goroutine وجمع أول خطأ. استخدم تجمعًا عندما تحتاج إلى مجموعة دائمة من العمال القابلة لإعادة الاستخدام.

إيقاف التشغيل بطريقة سلسة

أغلق قناة jobs لإعلام العمال بالتوقف. وبعد انتهاء WaitGroup، أغلق النتائج. يجب أن تتم أي عمليات إرسال معلقة للمهام قبل close(jobs).

تحقق سريع

كيف يُعلِم تجمع العمال العمالَ بالتوقف عن المعالجة؟

مراجعة: تجمع العمال

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

  • تقرأ N من goroutine الثابتة من قناة jobs واحدة
  • أغلق قناة jobs لإعلام العمال بإتمام العمل
  • يتتبع WaitGroup اكتمال العمل؛ وأغلق النتائج عند الانتهاء
  • العمل المقيّد بوحدة المعالجة المركزية: حجم التجمع ≈ NumCPU؛ والعمل المقيّد بعمليات الإدخال والإخراج: حجم أكبر

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

هل درس «نمط مجموعة العمال» مجاني؟

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

ماذا ستتعلم في «نمط مجموعة العمال»؟

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

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

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

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

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

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

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

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

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