مجدول المهام بلغة 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