إيقاف المهام بسلاسة
أوقف المهام بطريقة نظيفة
إيقاف المهام بسلاسة درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
إيقاف المهام بطريقة نظيفة
قد يتسبب إيقاف المجدول أثناء تنفيذ مهمة في إفساد البيانات أو ترك عمل غير مكتمل. يعني الإيقاف السلس إيقاف قبول عمليات التشغيل الجديدة، والسماح للمهام الجارية بالانتهاء ضمن مهلة محددة، ثم الخروج.
الاستماع إلى الإشارات
التقط إشارات نظام التشغيل مثل SIGINT (Ctrl+C) وSIGTERM (إشارة إيقاف من المنسّق) حتى تتمكن من إيقاف التشغيل عمدًا.
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
<-sig
fmt.Println("shutting down")signal.NotifyContext
يوفّر Go 1.16+ أداة مساعدة مرتبة تلغي Context عند وصول إشارة.
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
<-ctx.Done()إيقاف المجدول
مع robfig/cron، تعيد c.Stop() كائن context يكتمل عند انتهاء جميع المهام قيد التشغيل. انتظر اكتماله حتى تنتهي المهام.
ctx := c.Stop() // stops scheduling, returns ctx
<-ctx.Done() // wait for running jobs
fmt.Println("all jobs finished")تمرير الإلغاء إلى المهام
مرّر context إلى كل مهمة حتى يتمكن العمل الطويل من التوقف سريعًا عند بدء الإيقاف.
func job(ctx context.Context) {
select {
case <-time.After(time.Hour):
case <-ctx.Done():
return // bail out early
}
}تحديد مدة الانتظار
لا تنتظر المهام المتوقفة إلى ما لا نهاية. استخدم context بمهلة زمنية حتى يكتمل الإيقاف حتى إذا علقت إحدى المهام.
shutCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()استخدام WaitGroups مع المجدولات المخصصة
إذا أنشأت مجدولًا خاصًا بك باستخدام goroutines، فتتبّعها بواسطة sync.WaitGroup واستدعِ Wait() أثناء الإيقاف.
var wg sync.WaitGroup
wg.Add(1)
go func() { defer wg.Done(); doWork() }()
// shutdown:
wg.Wait()تجنب بدء عمل جديد
بمجرد بدء الإيقاف، يجب أن يتوقف ticker أو cron عن إطلاق العمليات. يضمن إغلاق قناة done أو إلغاء context أن ترى الحلقة الإشارة وتتوقف عن جدولة عمليات تشغيل جديدة.
تساعد قابلية التكرار الآمن
صمّم المهام بحيث يكون تشغيلها مجددًا آمنًا. إذا أُوقفت مهمة في منتصف تنفيذها ثم أُعيدت المحاولة بعد إعادة التشغيل، فإن المنطق القابل للتكرار الآمن يتجنب التأثيرات المكررة، مثل إرسال رسالتين أو تحصيل الرسوم مرتين.
النمط الكامل
بجمع كل ذلك: context يُلغى عند وصول إشارة، وStop في cron يعيد context لتصريف المهام، ومهلة زمنية محددة. هذا هو الهيكل القياسي للإيقاف السلس للخدمات المجدولة.
قابل للتشغيل: الإيقاف السلس باستخدام Context
يشغّل هذا البرنامج المستقل عاملًا دوريًا ويوقفه بسلاسة عبر إلغاء context، مع انتظار انتهاء النبضة قيد التنفيذ.
package main
import (
"context"
"fmt"
"sync"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
t := time.NewTicker(5 * time.Millisecond)
defer t.Stop()
for {
select {
case <-t.C:
fmt.Println("working")
case <-ctx.Done():
fmt.Println("stopping cleanly")
return
}
}
}()
time.Sleep(17 * time.Millisecond)
cancel() // signal shutdown
wg.Wait() // wait for worker to finish
fmt.Println("shutdown complete")
}تحقق سريع
اختبر مدى فهمك للإيقاف السلس للمهام.
مراجعة
لقد تعلمت الإيقاف السلس للمهام:
- التقط SIGINT/SIGTERM، ويفضل استخدام
signal.NotifyContext - تعيد
cron.Stop()كائن context لتصريف المهام قيد التشغيل - مرّر context إلى المهام وحدد مدة الانتظار بمهلة زمنية
- اجعل المهام قابلة للتكرار الآمن حتى تكون إعادة المحاولة آمنة
الأسئلة الشائعة
هل درس «إيقاف المهام بسلاسة» مجاني؟
نعم — نص درس «إيقاف المهام بسلاسة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الجدولة المستندة إلى الوقت
- مكتبة robfig/cron
- Tickers للفواصل الزمنية
- إيقاف المهام بسلاسة