0Pricing
Go Academy · درس

المهلات والمؤقتات

استخدام time.After وtime.Tick مع select

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

أهمية المهلات الزمنية

من دون مهلات زمنية، قد تحجب goroutine التي تنتظر قناة بطيئة التنفيذ إلى الأبد. وتوفر حزمة time بدائيات لإضافة تحكم زمني إلى عمليات القنوات.

استخدام time.After لمهلة لمرة واحدة

تعيد time.After(d) قناة تستقبل قيمة بعد المدة d. استخدمها في حالة select لإلغاء الانتظار.

select {
case res := <-ch:
    fmt.Println(res)
case <-time.After(2 * time.Second):
    fmt.Println("timed out")
}

المهلات المتكررة باستخدام time.NewTimer

بالنسبة إلى المؤقتات القابلة لإعادة الاستخدام، استخدم time.NewTimer واستدعِ Reset بعد كل استخدام. استدعِ Stop لمنع تسرّب goroutine الخاصة بالمؤقت.

timer := time.NewTimer(5 * time.Second)
defer timer.Stop()
select {
case <-timer.C:
    fmt.Println("timer fired")
}

‏time.Tick مقابل time.NewTicker

تُعد time.Tick مريحة، لكنها تسرّب المؤقت الدوري الأساسي — لذلك يُفضّل استخدام time.NewTicker حتى تتمكن من استدعاء Stop() لتحرير الموارد.

ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

استخدام Ticker في حلقة

ادمج ticker مع قناة done لتنفيذ عمل دوري يتوقف بطريقة نظيفة.

ticker := time.NewTicker(time.Second)
done := make(chan struct{})
go func() {
    for {
        select {
        case <-ticker.C:
            doWork()
        case <-done:
            ticker.Stop()
            return
        }
    }
}()

تسرّب time.After

تنشئ time.After مؤقتًا جديدًا في كل استدعاء، ولا يمكن جمع المؤقت بواسطة جامع البيانات المهملة حتى ينطلق. استخدم في الحلقة الضيقة time.NewTimer مع Reset لتجنب تسرّب المؤقتات.

الموعد النهائي مقابل المهلة الزمنية

المهلة الزمنية مدة نسبية («انتظر 5s»). أما الموعد النهائي فهو وقت مطلق («انتظر حتى 14:00»). استخدم time.Until(deadline) لتحويل الموعد النهائي إلى مدة يمكن استخدامها مع time.After.

deadline := time.Now().Add(5 * time.Second)
select {
case v := <-ch:
    use(v)
case <-time.After(time.Until(deadline)):
    fmt.Println("deadline exceeded")
}

يُفضّل استخدام context.WithTimeout

بالنسبة إلى معالجات HTTP والعمل المنظم، يُفضّل استخدام context.WithTimeout بدلًا من مهلات القنوات الخام — إذ ينشر الإلغاء تلقائيًا عبر مكدس الاستدعاءات.

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

تحديد معدل الطلبات باستخدام Ticker

يُعد ticker أبسط محدد لمعدل الطلبات: أرسل طلبًا واحدًا في كل نبضة. ولدعم الدفعات، املأ قناة ذات مخزن مؤقت مسبقًا وأعد ملأها باستخدام ticker.

requests := make(chan int, 5)
for i := 0; i < 5; i++ { requests <- i }
close(requests)
limiter := time.NewTicker(200 * time.Millisecond)
for req := range requests {
    <-limiter.C
    fmt.Println("request", req)
}

الساعة الرتيبة

تستخدم مدد المؤقتات في Go الساعة الرتيبة، لا ساعة الحائط، ولذلك لا تتأثر بتعديلات ساعة النظام. ويستخدمها أيضًا كل من time.Since وtime.Until.

إيقاف ticker بطريقة صحيحة

بعد استدعاء ticker.Stop()، لا تُغلق قناة ticker — بل تتوقف عن استقبال القيم فحسب. فرّغ أي قيمة معلقة في القناة عند الحاجة قبل العودة.

تحقق سريع

لماذا يُفضّل استخدام time.NewTicker على time.Tick؟

مراجعة: المهلات الزمنية و Ticker

النقاط الأساسية:

  • استخدم time.After لمهلة لمرة واحدة داخل select
  • استخدم time.NewTicker للعمل المتكرر؛ واستدعِ Stop() دائمًا
  • تجنب time.After في الحلقات — فهو يسرّب المؤقتات
  • يُفضّل استخدام context.WithTimeout للعمل القابل للإلغاء

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

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

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

ماذا ستتعلم في «المهلات والمؤقتات»؟

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

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

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

كم من الوقت يستغرق درس «المهلات والمؤقتات»؟

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

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

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

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

  1. عبارة select
  2. المهلات والمؤقتات
  3. أنماط Fan-in وFan-out
  4. نمط مجموعة العمال
← العودة إلى Go Academy