0Pricing
Go Academy · درس

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

حدّد التزامن

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

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

تُطلق مجموعة العاملين عددًا ثابتًا من goroutines، تسحب جميعها المهام من قناة مشتركة. وبدلًا من إنشاء goroutine لكل مهمة، تنشئ N من العاملين وتزوّدهم بالعمل.

  • تحدّ من عدد العمليات المتزامنة
  • تعيد استخدام goroutines بدلًا من إنشاء الآلاف منها
  • تحمي الموارد المشتركة مثل قواعد البيانات أو واجهات برمجة التطبيقات

لماذا نحدّ من التزامن

يمكن أن تستنفد goroutines غير المحدودة الذاكرة أو واصفات الملفات، أو أن ترهق خدمةً لاحقة. تمنحك المجموعة وسيلة للتحكم في مقدار العمل الذي يُنفَّذ في الوقت نفسه.

إذا كان لديك 10000 عنوان URL لجلبها، فلن ترغب في إرسال 10000 طلب HTTP في الوقت نفسه. تحافظ مجموعة مؤلفة من 20 عاملًا على الوضع تحت السيطرة.

قناة jobs

تتدفق المهام إلى قناة jobs. ويقرأ كل عامل منها ضمن حلقة for range. عند إغلاق القناة، تنتهي الحلقة ويخرج العامل.

jobs := make(chan int, 100)
for j := 1; j <= 5; j++ {
    jobs <- j
}
close(jobs)

عامل واحد

العامل ليس إلا دالةً تكرّر على قناة المهام. فهو يعالج كل مهمة ويكتب النتيجة في قناة النتائج.

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        results <- j * 2
    }
}

بدء عدة عاملين

أطلق المجموعة باستخدام حلقة بسيطة. يبدأ كل تكرار goroutine واحدًا يشغّل دالة العامل نفسها. وتشترك جميعها في قناتي المهام والنتائج نفسيهما.

for w := 1; w <= 3; w++ {
    go worker(w, jobs, results)
}

أنواع القنوات الاتجاهية

لاحظ <-chan int، أي قناة للاستقبال فقط، وchan<- int، أي قناة للإرسال فقط، في توقيع العامل. تتيح هذه الأنواع الاتجاهية للمصرّف منع العامل من الإرسال عرضيًا إلى jobs أو القراءة من results.

جمع النتائج

بعد إرسال جميع المهام وإغلاق القناة، تقرأ goroutine الرئيسية عددًا من النتائج يساوي عدد المهام تمامًا. وهذا يزامن البرنامج حتى لا ينتهي مبكرًا.

sum := 0
for a := 1; a <= 5; a++ {
    sum += <-results
}
fmt.Println("total:", sum)

مجموعة عاملين كاملة قابلة للتشغيل

إليك النمط الكامل في برنامج واحد: يضاعف ثلاثة عاملين خمسة أرقام. شغّله ولاحظ المجموع.

package main

import "fmt"

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        results <- j * 2
    }
}

func main() {
    jobs := make(chan int, 5)
    results := make(chan int, 5)
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)
    total := 0
    for a := 1; a <= 5; a++ {
        total += <-results
    }
    fmt.Println("total:", total)
}

القنوات المخزّنة مؤقتًا وغير المخزّنة

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

اختيار حجم المجموعة

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

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Println("CPUs:", runtime.NumCPU())
}

تجنّب تسرّبات goroutines

إذا نسيت close(jobs)، فستظل العوامل محجوبة إلى الأبد على قناة فارغة، مما يؤدي إلى تسرّبها. أغلق قناة jobs دائمًا بعد إرسال كل العمل، حتى تنتهي حلقات for range.

اختبار سريع

اختبر مدى فهمكم لمجموعات العمال.

مراجعة

تعلّمتم نمط مجموعة العمال:

  • إنشاء عدد ثابت من العمال الذين يقرأون من قناة مهام مشتركة
  • استخدام أنواع القنوات الاتجاهية لمزيد من الأمان
  • إغلاق قناة المهام لإنهاء العمال
  • جمع النتائج لمزامنة الإكمال
  • تحديد حجم المجموعة وفقًا لنوع عبء العمل (وحدة المعالجة المركزية أم الإدخال والإخراج)

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

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

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

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

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

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

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

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

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

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

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

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

  1. نمط تجمع العاملين
  2. التوزيع والتجميع
  3. مراحل المسار
  4. إيقاف التشغيل بسلاسة
← العودة إلى Go Academy