0Pricing
Go Academy · درس

اكتشاف التسرب والإلغاء

ضمان خروج Goroutines ومنع التسربات

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

ما تسرّب goroutine؟

يحدث تسرّب goroutine عندما يبدأ goroutine لكنه لا ينتهي أبدًا. تتراكم goroutines المتسرّبة بمرور الوقت، فتستهلك ذاكرة المكدس ووحدة المعالجة المركزية إلى أن تُنهى العملية.

تسرّب شائع: استقبال محجوب من قناة

يظل goroutine الذي ينتظر استقبال قيمة من قناة لا تصلها أي قيمة محجوبًا إلى الأبد:

go func() {
    v := <-ch // leaks if no sender and ch is never closed
    use(v)
}()

تسرّب شائع: عدم وجود إشارة انتهاء

يستمر goroutine الموجود داخل حلقة for بلا شرط خروج أو قناة done في العمل إلى الأبد:

go func() {
    for {
        work()
        // no exit condition — leaks
    }
}()

اكتشاف التسريبات باستخدام goleak

تتحقق go.uber.org/goleak من عدم تسرّب أي goroutines عند نهاية الاختبار:

func TestMyFunc(t *testing.T) {
    defer goleak.VerifyNone(t)
    myFunc() // should not leak goroutines
}

السياق علاج التسريبات

الطريقة الاصطلاحية لإيقاف goroutines طويلة التشغيل هي استخدام سياق. مرّر ctx إلى goroutine ونفّذ select على ctx.Done().

go func(ctx context.Context) {
    for {
        select {
        case work := <-workCh:
            process(work)
        case <-ctx.Done():
            return // clean exit
        }
    }
}(ctx)

نمط قناة done

في الحالات الأبسط التي لا تحتاج إلى سياق، استخدم قناة done مخصّصة. أغلقها لبث إشارة الإيقاف إلى جميع goroutines التي تقرأ منها.

done := make(chan struct{})
go func() {
    select {
    case v := <-data: use(v)
    case <-done: return
    }
}()
close(done) // stops goroutine

الاكتشاف باستخدام runtime

اطبع عدد goroutines لاكتشاف الزيادة أثناء التشغيل:

fmt.Println("goroutines:", runtime.NumGoroutine())

goroutines خادم HTTP

يدير net/http goroutines الخاصة بكل طلب تلقائيًا وينظّفها عند انتهاء الطلب. لكن معالجات الطلبات التي تطلق goroutines من دون تنظيفها قد تتسبب مع ذلك في تسريبات.

اختبار التسريبات

شغّل مجموعة اختباراتك باستخدام goleak بوصفه TestMain أو باستخدام defer في كل اختبار. يؤدي عدم إنهاء أي goroutine بعد جسم الاختبار إلى فشل الاختبار.

func TestMain(m *testing.M) {
    goleak.VerifyTestMain(m)
}

تسريبات Time.After

ينشئ time.After داخل select في حلقة مؤقتًا جديدًا في كل تكرار، ولا يمكن أن تجمعه GC حتى ينطلق. استبدله بـ time.NewTimer وReset.

تسرّب ناتج عن إعادة goroutine خطأً

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

اختبار سريع

ما الطريقة الاصطلاحية الأكثر استخدامًا لإيقاف goroutine طويلة التشغيل في Go؟

خلاصة: اكتشاف التسريبات والإلغاء

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

  • تتراكم تسريبات goroutine؛ راقبها باستخدام runtime.NumGoroutine()
  • تكتشف goleak تسريبات goroutine تلقائيًا في الاختبارات
  • وفّر دائمًا مسار خروج لـ goroutines: سياق أو قناة done أو قناة إدخال مغلقة
  • تسبب time.After تسريبات للمؤقتات داخل الحلقات؛ استخدم NewTimer+Reset

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

هل درس «اكتشاف التسرب والإلغاء» مجاني؟

نعم — نص درس «اكتشاف التسرب والإلغاء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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. أنماط خطوط الأنابيب والمراحل
  2. ‏errgroup لمعالجة الأخطاء المتزامنة
  3. نمط Semaphore
  4. اكتشاف التسرب والإلغاء
← العودة إلى Go Academy