مخطط المهام بلغة Go (Golang): cron وgocron وasynq

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

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

ابدأ الدورة

مخطط المهام بلغة Go (Golang): من cron إلى asynq



في تطوير الخوادم الحديث بلغة Go (Golang)، غالبًا ما تنشأ الحاجة لتنفيذ كود وفقًا لجدول زمني أو بتأخير. تنظيف ذاكرة التخزين المؤقت، إرسال الإشعارات، إنشاء التقارير - كل هذا يتطلب مخطط مهام موثوقًا. في هذه المقالة، سنستعرض بالتفصيل ثلاث طرق شائعة: الحزمة القياسية cron، والمكتبة خفيفة الوزن gocron، وقائمة الانتظار الموزعة asynq. ستتعرف على الأداة التي تختارها لمشروعك على PythonLib.



1. cron القياسي لـ Go



مكتبة github.com/robfig/cron/v3 هي المعيار الفعلي لجدولة المهام المتكررة في Go. تستخدم صياغة تعبيرات cron المألوفة (5 حقول) وتدعم الثواني والمناطق الزمنية والتعافي من حالات الذعر (panic).



التثبيت ومثال أساسي



go get github.com/robfig/cron/v3


مثال لمخطط يقوم بتشغيل مهمة كل 30 ثانية:



package main

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

func main() { c := cron.New() // إضافة مهمة بتعبير cron: كل 30 ثانية _, err := c.AddFunc("*/30 * * * * *", func() { fmt.Println("تم تنفيذ المهمة:", time.Now()) }) if err != nil { panic(err) } c.Start() // حظر goroutine الرئيسية select {}}


الميزات الرئيسية:

  • دعم تعبيرات cron القياسية (5 أو 6 حقول مع الثواني)
  • الاسترداد التلقائي بعد حالة الذعر في المهمة
  • إمكانية تعيين المنطقة الزمنية عبر cron.WithLocation()
  • تسجيل الأحداث عبر cron.WithLogger()


الاستخدام المتقدم: المهام المتسلسلة



c := cron.New(cron.WithSeconds())

// مهمة باسم للإدارةid, _ := c.AddFunc("@every 5m", func() { fmt.Println("يتم التنفيذ كل 5 دقائق")})

// حذف المهمة بواسطة المعرفc.Remove(id)

// إيقاف المخططc.Stop()


المكتبة مثالية للمهام الدورية البسيطة داخل عملية واحدة. ومع ذلك، بالنسبة للأنظمة الموزعة (عدة نسخ مكررة من خادم Go)، ستكون هناك حاجة لقفل خارجي لمنع تنفيذ المهمة في وقت واحد على جميع العقد.



2. Gocron — جدولة خفيفة مع سلاسل



github.com/go-co-op/gocron تقدم واجهة برمجة تطبيقات أكثر حداثة بدون تعبيرات cron. بدلاً من السلاسل النصية، تستخدم سلاسل من الدوال. هذا مناسب بشكل خاص للمبتدئين.



مثال مع gocron



package main

import ( "fmt" "time" "github.com/go-co-op/gocron")

func main() { s := gocron.NewScheduler(time.UTC) // مهمة يتم تنفيذها كل دقيقتين _, _ = s.Every(2).Minutes().Do(func() { fmt.Println("مرت دقيقتان") }) // مهمة بتأخير بعد البدء _, _ = s.Every(1).Day().At("10:30").Do(func() { fmt.Println("يوميًا في الساعة 10:30") }) s.StartBlocking()}


مزايا gocron:

  • واجهة برمجة تطبيقات سهلة القراءة: .Every(10).Seconds()
  • دعم مدمج للأقفال الموزعة عبر Redis (اختياري)
  • إمكانية تعيين حد لعدد مرات التشغيل
  • معالجات أخطاء عامة ومحلية


إذا كنت بحاجة إلى حل بسيط لخدمة مصغرة بدون تبعيات خارجية - فإن gocron سيكون خيارًا ممتازًا. إنه أخف من cron ولا يتطلب معرفة بصياغة تعبيرات cron.



3. Asynq — قائمة انتظار موزعة للمهام المؤجلة



github.com/hibiken/asynq ليس مجرد مخطط، بل هو نظام قوائم انتظار كامل يعتمد على Redis. يسمح بتأجيل المهام، وتعيين الأولويات، وإعادة تشغيل المهام الفاشلة، وتتبع حالتها عبر واجهة ويب.



بنية asynq



Asynq مع

توصيات