0Pricing
Go Academy · درس

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

أوقف العاملين بطريقة نظيفة

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

لماذا الإيقاف السلس

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

  • لا توجد goroutines متسرّبة
  • لا توجد عمليات كتابة غير مكتملة
  • خروج نظيف للعملية

نمط قناة done

من الأساليب الكلاسيكية استخدام قناة done. يؤدي إغلاقها إلى بث إشارة توقف إلى جميع goroutines التي تستمع إليها، لأن القراءة من قناة مغلقة تعود فورًا.

done := make(chan struct{})
// ... later
close(done)

select لإشارات التوقف

تستخدم worker تعليمة select إما لمعالجة مهمة أو لاكتشاف قناة done. وعند إغلاق done، تُنفّذ الحالة المناسبة وتعود worker.

for {
    select {
    case <-done:
        return
    case j := <-jobs:
        process(j)
    }
}

context.Context

الأداة الحديثة الاصطلاحية هي context. تمنحكم context.WithCancel سياقًا ودالة إلغاء. يؤدي استدعاء cancel إلى إغلاق قناة Done الخاصة بالسياقات.

ctx, cancel := context.WithCancel(context.Background())
defer cancel()

الاستماع إلى ctx.Done()

تستخدم العمال ctx.Done() ضمن select. وعند استدعاء cancel أو تجاوز الموعد النهائي، تُغلق القناة وتخرج worker.

select {
case <-ctx.Done():
    return ctx.Err()
case j := <-jobs:
    process(j)
}

انتظار العمال

لا يكفي إرسال إشارة التوقف؛ بل يجب الانتظار حتى ينهي العمال عملهم فعلًا. يتتبّع sync.WaitGroup العمال، بحيث يمكن لـ main التوقف حتى يصل العدد إلى الصفر.

var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()
    runWorker(ctx)
}()
// ... later
cancel()
wg.Wait()

المهلات الزمنية باستخدام context

يلغي context.WithTimeout السياق تلقائيًا بعد مدة معينة. وهذا يحدّ من المدة التي قد يستغرقها الإيقاف قبل فرض الخروج.

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

إيقاف سلس متكامل

يشغّل هذا البرنامج عاملين، ويلغي السياق، وينتظر خروجهما النظيف قبل طباعة done.

package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

func worker(ctx context.Context, id int, wg *sync.WaitGroup) {
    defer wg.Done()
    for {
        select {
        case <-ctx.Done():
            fmt.Printf("worker %d stopping\n", id)
            return
        case <-time.After(50 * time.Millisecond):
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup
    for i := 1; i <= 2; i++ {
        wg.Add(1)
        go worker(ctx, i, &wg)
    }
    time.Sleep(120 * time.Millisecond)
    cancel()
    wg.Wait()
    fmt.Println("all workers stopped")
}

استنزاف العمل الجاري

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

التقاط إشارات نظام التشغيل

في الخوادم الفعلية، تربط signal.NotifyContext الإلغاء بالإشارتين SIGINT وSIGTERM. ويؤدي الضغط على Ctrl+C إلى تشغيل مسار الإيقاف السلس نفسه الناتج عن الإلغاء اليدوي.

ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()

لا تنسوا cancel() أبدًا

استخدموا دائمًا defer cancel() حتى عند استخدام WithTimeout. يؤدي عدم استدعاء cancel إلى تسرّب goroutine والمؤقت الداخليين للسياق حتى انقضاء الموعد النهائي.

اختبار سريع

اختبروا معرفتكم بالإيقاف.

مراجعة

تعلّمتم الإيقاف السلس:

  • استخدموا context.WithCancel أو قناة done لإرسال إشارة التوقف
  • تستخدم العمال ctx.Done() ضمن select
  • يضمن WaitGroup خروج جميع العمال فعلًا
  • اربطوا الإلغاء بإشارات نظام التشغيل في الخوادم الفعلية
  • استخدموا دائمًا defer cancel()

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

هل درس «إيقاف التشغيل بسلاسة» مجاني؟

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

ماذا ستتعلم في «إيقاف التشغيل بسلاسة»؟

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

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

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

كم من الوقت يستغرق درس «إيقاف التشغيل بسلاسة»؟

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

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

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

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

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