0Pricing
Go Academy · درس

‏errgroup لمعالجة الأخطاء المتزامنة

استخدام golang.org/x/sync/errgroup عمليًا

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

مشكلة goroutines والأخطاء

يؤدي تشغيل goroutines باستخدام go func() إلى تجاهل القيم المعادة، بما فيها الأخطاء. وتحتاج إلى آليات إضافية، مثل القنوات وWaitGroup، لجمعها. وتبسّط errgroup هذه العملية.

golang.org/x/sync/errgroup

تشغّل errgroup.Group goroutines وتجمع الأخطاء. وتحجب Wait() التنفيذ حتى تنتهي جميع goroutines، ثم تعيد أول خطأ غير nil.

var g errgroup.Group
g.Go(func() error { return fetchUsers() })
g.Go(func() error { return fetchOrders() })
if err := g.Wait(); err != nil {
    log.Fatal(err)
}

errgroup.WithContext

تعيد WithContext مجموعةً وcontext مشتقًا. ويُلغى هذا الـcontext عندما تعيد أول goroutine خطأً، مما يوقف العمل المتبقي.

g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
g.Go(func() error { return doOtherWork(ctx) })
err := g.Wait()

جمع النتائج إلى جانب الأخطاء

لا تجمع errgroup النتائج، بل الأخطاء فقط. التقط النتائج في شرائح مخصصة مسبقًا، مع الوصول إليها باستخدام الفهرس لتجنب الحاجة إلى المزامنة:

results := make([]Result, len(items))
for i, item := range items {
    i, item := i, item
    g.Go(func() error {
        r, err := process(ctx, item)
        if err != nil { return err }
        results[i] = r
        return nil
    })
}
if err := g.Wait(); err != nil { return err }

g.SetLimit (Go 1.20+)

تحدد g.SetLimit(n) الحد الأقصى لعدد goroutines التي تعمل بالتزامن، وتعمل كـ semaphore مضمّن دون الحاجة إلى قناة منفصلة.

g.SetLimit(10) // at most 10 goroutines at once
for _, item := range items {
    g.Go(func() error { return process(item) })
}

g.TryGo

تبدأ g.TryGo(f) تشغيل goroutine فقط إذا سمح الحد، الذي عيّنته SetLimit، بذلك. وتعيد false إذا لم تبدأ التشغيل.

إعادة أول خطأ فقط

تعيد errgroup الخطأ الأول فقط. وإذا احتجت إلى جميع الأخطاء، فاجمعها في شريحة محمية بواسطة mutex داخل كل goroutine.

var mu sync.Mutex
var errs []error
g.Go(func() error {
    if err := doWork(); err != nil {
        mu.Lock(); errs = append(errs, err); mu.Unlock()
    }
    return nil
})

الفرق عن sync.WaitGroup

يتتبع WaitGroup اكتمال التنفيذ، بينما يتتبع errgroup الاكتمال ويجمع الأخطاء أيضًا. فضّل errgroup عندما ينبغي الإبلاغ عن فشل أي goroutine.

تمرير إلغاء context

عند استخدام errgroup.WithContext، يرسل إلغاء الـcontext المشتق إشارة إلى جميع goroutines الأخرى للتوقف، وفق دلالات الإلغاء عند أول خطأ.

اختبار كود errgroup

في الاختبارات، أدخل context باستخدام WithTimeout لضمان عدم استمرار المجموعة إلى ما لا نهاية إذا علقت إحدى goroutines.

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
g, ctx := errgroup.WithContext(ctx)

بديل semaphore

قبل SetLimit (في إصدارات Go الأقدم من 1.20)، استخدم قناة ذات مخزن مؤقت باعتبارها semaphore داخل goroutines الفردية لتحقيق التأثير نفسه.

تحقق سريع

ماذا تعيد errgroup.WithContext ولا تعيده errgroup.Group العادية؟

مراجعة: errgroup

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

  • g.Go(func() error) — تشغيل goroutine وجمع أول خطأ
  • g.Wait() — يحجب التنفيذ حتى انتهاء الجميع؛ ثم يعيد أول خطأ
  • WithContext — إلغاء context عند أول خطأ
  • g.SetLimit(n) — تحديد عدد goroutines المتزامنة (في Go 1.20 والإصدارات الأحدث)

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

هل درس «‏errgroup لمعالجة الأخطاء المتزامنة» مجاني؟

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

ماذا ستتعلم في «‏errgroup لمعالجة الأخطاء المتزامنة»؟

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

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

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

كم من الوقت يستغرق درس «‏errgroup لمعالجة الأخطاء المتزامنة»؟

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

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

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

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

  1. أنماط خطوط الأنابيب والمراحل
  2. ‏errgroup لمعالجة الأخطاء المتزامنة
  3. نمط Semaphore
  4. اكتشاف التسرب والإلغاء
← العودة إلى Go Academy