1. مقدمة

مكتبة Golang cron هي أداة قوية وسهلة الاستخدام تتيح جدولة تشغيل الوظائف في أوقات محددة أو بفواصل زمنية. تم تصميمها بناءً على خدمة UNIX cron ولكنها مُنفَّذة كمكتبة مستقلة يمكن دمجها في تطبيقات Go. تهتم مكتبة الـ cron بجدولة الوقت، مما يتيح لك التركيز على الوظيفة التي يجب تنفيذها.

2. مثال

تثبيت مكتبة الـ cron

للبدء في استخدام مكتبة الـ cron في مشروعك، يجب عليك تثبيتها أولاً باستخدام أمر go get:

go get github.com/robfig/cron/[email protected]

استيراد حزمة الـ cron

بعد التثبيت، يمكنك استيرادها في برنامج Go الخاص بك على النحو التالي:

import "github.com/robfig/cron/v3"

فيما يلي مثال بسيط على كيفية إعداد وظيفة Cron تقوم بطباعة رسالة كل دقيقة:

package main

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

func main() {
	c := cron.New()
	c.AddFunc("0 30 * * * *", func() { fmt.Println("كل ساعة في منتصف الساعة") })
	c.AddFunc("@hourly",      func() { fmt.Println("كل ساعة") })
	c.AddFunc("@every 1h30m", func() { fmt.Println("كل ساعة ونصف") })
	c.Start()
	..
	// يتم استدعاء الوظائف في جروتينها الخاصة، بشكل غير متزامن.
	...
	// يمكن إضافة الوظائف أيضًا إلى Cron الجاري
	c.AddFunc("@daily", func() { fmt.Println("كل يوم") })
	..
	..
	c.Stop()  // إيقاف المجدول (لا يوقف أي وظائف تعمل بالفعل).
}

3. صيغة تعبير الـ CRON

يمثل تعبير cron مجموعة من الأوقات، مع استخدام 6 حقول مفصولة بفراغ.

اسم الحقل إلزامي؟ القيم المسموح بها الرموز الخاصة المسموح بها
الثواني نعم 0-59 * / , -
الدقائق نعم 0-59 * / , -
الساعات نعم 0-23 * / , -
يوم الشهر نعم 1-31 * / , - ?
الشهر نعم 1-12 or JAN-DEC * / , -
يوم الأسبوع نعم 0-6 or SUN-SAT * / , - ?

4. الرموز الخاصة في تعبيرات الـ CRON

  • النجمة ( * ) تمثل النجمة جميع القيم الممكنة للحقل المعطى. على سبيل المثال، النجمة في حقل الدقيقة تعني كل دقيقة.
  • شرطة مائلة ( / ) يُستخدم الحرف شرطة المائلة لتحديد الزيادات. على سبيل المثال، "*/15" في حقل الثواني يعني كل 15 ثانية بدءًا من الصفر.
  • فاصلة ( , ) يُستخدم حرف الفاصلة لتقديم قائمة من القيم المنفصلة. على سبيل المثال، "MON,WED,FRI" في حقل يوم الأسبوع يعني أن الوظيفة ستعمل يوم الاثنين والأربعاء والجمعة.
  • شرطة ( - ) تُعبر الشرطة عن مجموعة من القيم. على سبيل المثال، "9-17" في حقل الساعات يشير إلى كل ساعة من الساعة 9 صباحًا حتى الساعة 5 مساءً.
  • علامة الاستفهام ( ? ) يمكن استخدام علامة الاستفهام في حقول يوم الشهر ويوم الأسبوع للدلالة على 'لا قيمة محددة'، وهو مفيد عند الحاجة إلى تحديد قيمة لأحدهما وليس الآخر.

5. الجداول الزمنية المحددة مُسبقًا

شرح مفصل للجداول الزمنية المحددة مُسبقًا المتاحة، معروض في شكل جدول:

الإدخال الوصف الما يُعادله
@yearly (أو @annually) تشغيل مرة واحدة في السنة، منتصف الليل، الأول من يناير 0 0 0 1 1 *
@monthly تشغيل مرة في الشهر، منتصف الليل، الأول من الشهر 0 0 0 1 * *
@weekly تشغيل مرة في الأسبوع، منتصف الليل بين يوم السبت والأحد 0 0 0 * * 0
@daily (أو @midnight) تشغيل مرة في اليوم، منتصف الليل 0 0 0 * * *
@hourly تشغيل مرة كل ساعة، في بداية الساعة 0 0 * * * *

6. الفواصل الزمنية وجدولة الفواصل الزمنية الثابتة

جدولة المهام للتنفيذ بفواصل زمنية ثابتة هي ميزة أخرى قوية في مكتبة الـ cron. على سبيل المثال، لجدولة مهمة تعمل كل ساعتين:

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

7. المناطق الزمنية وجدولة المهام

يتم التفسير والجدولة في المنطقة الزمنية المحلية للجهاز الذي يعمل عليه تطبيق Go. يجب أخذ الحيطة أثناء تغييرات التوقيت الصيفي، حيث أن بعض الأوقات قد لا تكون موجودة أو تُكرر.

8. سلامة الخيوط والتزامن

تم تصميم مكتبة الـ cron لتكون آمنة للاستخدام مع عمليات الخيوط والتوازن. من الضروري بالنسبة للمتصل الحفاظ على تسلسل صحيح لاستدعاءات الأساليب لتجنب حالات السباق. يجب استخدام آليات التزامن السليمة عند الضرورة لضمان جدولة المهام وتنفيذها بشكل صحيح.