Go Academy · درس

المؤقتات وTickers

جدوِل العمل وكرّره

الدرس 3 من 413 خطوة

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

الإيقاف المؤقت باستخدام Sleep

أبسط أداة للجدولة هي time.Sleep(d)، إذ توقفها مؤقتًا لمدة معينة.

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("start")
    time.Sleep(10 * time.Millisecond)
    fmt.Println("done")
}

ما المؤقت؟

يعمل time.Timer مرة واحدة بعد انقضاء مدة تأخير. ويرسل الوقت الحالي عبر قناته C عند انتهاء المدة.

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.NewTimer(10 * time.Millisecond)
    <-t.C
    fmt.Println("timer fired")
}

الاختصار time.After

تعيد time.After(d) قناة تُرسل قيمة واحدة بعد انقضاء مدة التأخير. وهي طريقة مريحة لإنشاء مؤقت يعمل مرة واحدة دون الحاجة إلى متغير.

package main

import (
    "fmt"
    "time"
)

func main() {
    <-time.After(10 * time.Millisecond)
    fmt.Println("elapsed")
}

إيقاف مؤقت

تلغي timer.Stop() المؤقت قبل تشغيله. وتعيد true إذا أوقفته في الوقت المناسب.

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.NewTimer(time.Hour)
    stopped := t.Stop()
    fmt.Println("stopped:", stopped)
}

ما المؤقت الدوري؟

يعمل time.Ticker بشكل متكرر على فواصل زمنية ثابتة، ويرسل عبر قناته C في كل مرة.

استخدمه لتنفيذ الأعمال الدورية مثل الاستطلاع أو إطارات الرسوم المتحركة.

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    <-ticker.C
    fmt.Println("tick")
    ticker.Stop()
}

عدّ الإشارات

كرّر على قناة المؤقت الدوري لتنفيذ إجراء عند كل فاصل زمني، ثم أوقفه بعد وصول عدد الإشارات إلى الحد المطلوب.

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    for i := 1; i <= 3; i++ {
        <-ticker.C
        fmt.Println("tick", i)
    }
    ticker.Stop()
}

أوقف المؤقت الدوري دائمًا

على عكس المؤقتات، يواصل المؤقت الدوري عمله حتى تستدعي Stop(). ويؤدي نسيان إيقافه إلى تسريب الموارد.

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    defer ticker.Stop()
    <-ticker.C
    fmt.Println("one tick, will stop on return")
}

سهولة استخدام time.Tick

تعيد time.Tick(d) قناة المؤقت الدوري مباشرةً. وهي بسيطة، لكن لا يمكن إيقافها؛ لذلك لا تستخدمها إلا طوال مدة تشغيل البرنامج.

package main

import (
    "fmt"
    "time"
)

func main() {
    c := time.Tick(5 * time.Millisecond)
    <-c
    fmt.Println("ticked")
}

المهلة باستخدام select

اجمع بين قناة العمل وtime.After داخل select لتنفيذ مهلة زمنية.

package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)
    go func() { done <- true }()
    select {
    case <-done:
        fmt.Println("work finished")
    case <-time.After(time.Second):
        fmt.Println("timed out")
    }
}

تشغّل AfterFunc دالة رد اتصال

تشغّل time.AfterFunc(d, f) الدالة f في goroutine خاصة بها بعد انقضاء مدة التأخير، دون أن تقرأ قناة بنفسك.

package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)
    time.AfterFunc(10*time.Millisecond, func() {
        fmt.Println("callback ran")
        done <- true
    })
    <-done
}

المؤقت مقابل المؤقت الدوري

اختر بناءً على التكرار:

  • Timer: يعمل مرة واحدة بعد مدة تأخير.
  • Ticker: يعمل مرارًا وتكرارًا على فاصل زمني.
  • أوقف كليهما عند الانتهاء لتحرير الموارد.
package main

import (
    "fmt"
    "time"
)

func main() {
    <-time.After(5 * time.Millisecond)
    fmt.Println("one-shot complete")
}

تحقق سريع

أي نوع يعمل بشكل متكرر على فاصل زمني ثابت؟

مراجعة: المؤقتات والمؤقتات الدورية

لقد تعلمت كيفية جدولة الأعمال:

  • يوقف Sleep التنفيذ مؤقتًا، بينما يعمل Timer وtime.After مرة واحدة.
  • يعمل Ticker وtime.Tick بشكل متكرر.
  • استخدم Stop() للتنظيف، واجمعه مع select لتنفيذ المهلات الزمنية.
package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    defer ticker.Stop()
    for i := 0; i < 2; i++ {
        <-ticker.C
        fmt.Println("beat")
    }
}
البدء مجانًا

تعلم Go مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

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

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

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

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

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

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

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

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

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

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

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

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

  1. الوقت والمدة
  2. التنسيق والتحليل
  3. المؤقتات وTickers
  4. المناطق الزمنية
← العودة إلى Go Academy