مجدول المهام بلغة Go (Golang): cron و gocron و robfig/cron

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مجدول المهام بلغة Go (Golang): cron و gocron و robfig/cron



مجدول المهام (task scheduler) هو أداة لا غنى عنها لأتمتة العمليات الدورية في التطبيقات: من تنظيف ذاكرة التخزين المؤقت وإرسال الإشعارات إلى تشغيل معالجات البيانات الخلفية. في نظام Go البيئي (Golang)، توجد عدة مكتبات شائعة لتنفيذ سلوك مشابه لـ cron. في هذه المقالة، سنستعرض ثلاثة أساليب رئيسية: الحزمة المدمجة cron، و gocron خفيفة الوزن، والمعيار الفعلي robfig/cron.



1. الحزمة المدمجة cron (تجريبية)



بدءًا من Go 1.19، ظهرت حزمة تجريبية cron في المكتبة القياسية ضمن golang.org/x/exp/cron. توفر وظائف أساسية لتشغيل المهام وفقًا لجدول زمني. ومع ذلك، نادرًا ما تُستخدم عمليًا بسبب محدودية الوظائف وعدم دعم تعبيرات cron المعقدة (مثل تلك التي تحتوي على الثواني).



package main

import ( "context" "fmt" "golang.org/x/exp/cron" "time")

func main() { sched := cron.New() // تشغيل كل 10 ثوانٍ sched.Add("*/10 * * * * *", func() { fmt.Println("تم تنفيذ المهمة:", time.Now()) }) sched.Start() time.Sleep(30 * time.Second) sched.Stop()}


2. مكتبة robfig/cron — المعيار الذهبي



مكتبة github.com/robfig/cron/v3 هي أشهر وأكثر تطبيقات مجدول المهام نضجًا في Go. تدعم:

  • تعبيرات cron القياسية (5 حقول) مع حقل ثوانٍ اختياري
  • جداول زمنية محددة مسبقًا: @yearly، @monthly، @weekly، @daily، @hourly
  • فترات زمنية: @every 5m (كل 5 دقائق)
  • المناطق الزمنية (timezone)
  • معالجة حالات الذعر (panics) عبر مسجل الاسترداد (Recovery logger)
  • نظام تسجيل مرن عبر واجهة Logger


التثبيت

go get github.com/robfig/cron/v3


مثال أساسي

package main

import ( "fmt" "github.com/robfig/cron/v3" "time")

func main() { c := cron.New(cron.WithSeconds()) // تفعيل دعم الثواني

// كل دقيقة عند الثانية 30 c.AddFunc("30 * * * * *", func() { fmt.Println("كل دقيقة عند الثانية 30:", time.Now().Format("15:04:05")) })

// كل يوم في الساعة 8:00 صباحًا c.AddFunc("0 0 8 * * *", func() { fmt.Println("يوميًا في الساعة 8:00") })

// كل ساعتين c.AddFunc("@every 2h", func() { fmt.Println("كل ساعتين") })

// يوم الاثنين في الساعة 9:30 c.AddFunc("30 9 * * 1", func() { fmt.Println("كل يوم اثنين في الساعة 9:30") })

c.Start() defer c.Stop()

// الانتظار لمدة دقيقة واحدة لرؤية التنفيذ time.Sleep(70 * time.Second)}


بناء جملة تعبيرات cron في robfig/cron

يتكون التعبير القياسي من 5 حقول (الدقائق، الساعات، يوم الشهر، الشهر، يوم الأسبوع). عند تفعيل الخيار cron.WithSeconds()، يُضاف حقل سادس — الثواني (0-59).

  • * — أي قيمة
  • */5 — كل 5 وحدات
  • 1,15,30 — قيم محددة
  • 1-10 — نطاق
  • L — الأخير (مثلًا، آخر يوم في الشهر)


3. مكتبة gocron — البساطة وسهولة القراءة



github.com/go-co-op/gocron تقدم واجهة fluent عالية المستوى لإنشاء الجداول الزمنية. إنها مثالية إذا كنت لا تحتاج إلى تعبيرات cron معقدة، بل تكفيك فترات زمنية بسيطة.



التثبيت

go get github.com/go-co-op/gocron/v2


مثال على الاستخدام

package main

import ( "fmt

توصيات