0Pricing
Go Academy · درس

الجدولة المستندة إلى الوقت

شغّل أعمالًا دورية

الجدولة المستندة إلى الوقت درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

تشغيل العمل وفق جدول زمني

تحتاج أنظمة كثيرة إلى عمل دوري: تنظيف الملفات المؤقتة كل ليلة، وإرسال رسالة بريد إلكتروني ملخّصة كل صباح، والاستعلام عن API كل دقيقة. يقدّم هذا الدرس جدولة العمل المستندة إلى الوقت في Go باستخدام المكتبة القياسية.

حزمة time

تُعد حزمة time في Go الأساس لذلك. ومن أهم أدواتها:

  • توقف time.Sleep goroutine مؤقتًا
  • تعيد time.After قناة تطلق إشارة مرة واحدة
  • تطلق time.Ticker إشارات متكررة
  • تطلق time.Timer إشارة واحدة بعد تأخير

حلقة ساذجة

أبسط جدولة هي: نفّذ العمل، ثم انتظر، ثم كرّر.

package main

import (
    "fmt"
    "time"
)

func main() {
    for i := 0; i < 3; i++ {
        fmt.Println("tick", i)
        time.Sleep(10 * time.Millisecond)
    }
}

لماذا تنحرف حلقة Sleep

تنحرف حلقة الانتظار: فإذا استغرق العمل 200ms وانتظرت 1s، فسيصبح الفاصل الحقيقي 1.2s، ويتراكم هذا الانحراف. وللحصول على فواصل زمنية دقيقة، استخدم Ticker، وهو ما سنتناوله في درس لاحق.

time.After للتأخيرات لمرة واحدة

تعيد time.After(d) قناة تستقبل إشارة مرة واحدة بعد المدة d. وهذا مفيد داخل select للمهل الزمنية.

select {
case <-time.After(2 * time.Second):
    fmt.Println("2s elapsed")
}

time.Timer

يطلق Timer إشارة مرة واحدة، ويمكن إيقافه أو إعادة ضبطه، بخلاف time.After الذي لا يمكنك إلغاؤه.

t := time.NewTimer(5 * time.Second)
defer t.Stop()
<-t.C
fmt.Println("fired")

الجدولة في وقت محدد

لتشغيل مهمة، مثلًا، عند الساعة 3 صباحًا، احسب المدة حتى ذلك الوقت وانتظرها باستخدام sleep أو timer، ثم أعد الجدولة لليوم التالي.

now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day(), 3, 0, 0, 0, now.Location())
if next.Before(now) {
    next = next.Add(24 * time.Hour)
}
fmt.Println("sleep for", time.Until(next))

المدد الزمنية ذات أنواع محددة

يمثل time.Duration قيمة int64 بوحدة النانوثانية، مع ثوابت مفيدة مثل: time.Second وtime.Minute وtime.Hour. اضرب هذه الثوابت للحصول على فواصل زمنية سهلة القراءة.

every := 30 * time.Minute
fmt.Println(every)

الساعة الرتيبة مقابل ساعة الحائط

يتضمن time.Now في Go قراءة رتيبة تُستخدم لقياس الوقت المنقضي، وهي محصّنة ضد تعديلات الساعة. استخدم time.Since للمدد، بدلًا من طرح قيم ساعة الحائط.

start := time.Now()
// ... work ...
fmt.Println("took", time.Since(start))

متى تستخدم مكتبة

بالنسبة إلى الجداول الزمنية المعقدة («كل يوم من أيام الأسبوع عند 9:15»)، تكون كتابة حسابات الوقت يدويًا عرضة للأخطاء. تحلّل مكتبة robfig/cron، التي سنتناولها لاحقًا، تعبيرات cron نيابةً عنك.

قابل للتشغيل: حساب التشغيل التالي

يحسب هذا البرنامج المستقل المدة المتبقية حتى بداية الدقيقة التالية، باستخدام حزمة time فقط.

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Date(2026, 1, 1, 10, 30, 45, 0, time.UTC)
    nextMinute := now.Truncate(time.Minute).Add(time.Minute)
    fmt.Println("now:", now.Format("15:04:05"))
    fmt.Println("next run:", nextMinute.Format("15:04:05"))
    fmt.Println("wait:", nextMinute.Sub(now))
}

تحقق سريع

اختبر مدى فهمك للجدولة المستندة إلى الوقت.

مراجعة

لقد تعلمت أساسيات الجدولة المستندة إلى الوقت:

  • توفر حزمة time الأدوات Sleep وAfter وTimer وTicker
  • تنحرف حلقات Sleep؛ بينما تحافظ tickers على الجدول
  • احسب المدد حتى وقت مستهدف باستخدام time.Until
  • استخدم time.Since والساعة الرتيبة لقياس الوقت المنقضي

الأسئلة الشائعة

هل درس «الجدولة المستندة إلى الوقت» مجاني؟

نعم — نص درس «الجدولة المستندة إلى الوقت» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «الجدولة المستندة إلى الوقت»؟

شغّل أعمالًا دورية تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «الجدولة المستندة إلى الوقت»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الجدولة المستندة إلى الوقت
  2. مكتبة robfig/cron
  3. Tickers للفواصل الزمنية
  4. إيقاف المهام بسلاسة
← العودة إلى Go Academy