0Pricing
Go Academy · บทเรียน

ตัวนับเวลาสำหรับช่วงเวลา

ทำซ้ำด้วยอัตราคงที่

ตัวนับเวลาสำหรับช่วงเวลา เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

การทำซ้ำด้วยอัตราคงที่

เมื่อคุณเพียงต้องการทำบางอย่างทุก ๆ N วินาที Ticker คือเครื่องมือที่เหมาะสม ต่างจากลูปที่ใช้การหลับ การทำงานจะเกิดขึ้นตามจังหวะที่สม่ำเสมอและไม่คลาดเคลื่อนตามเวลาที่ใช้ทำงาน

การสร้าง Ticker

time.NewTicker(d) ส่งคืน Ticker ที่ช่องสัญญาณ C จะได้รับเวลาปัจจุบันทุก ๆ d

ticker := time.NewTicker(time.Second)
defer ticker.Stop()

หยุด Ticker เสมอ

ตัวส่งสัญญาณตามช่วงเวลาจะทำให้ตัวจับเวลาภายในยังทำงานอยู่ หากคุณไม่เรียก Stop() ตัวจับเวลาจะรั่วไหล ใช้ defer ticker.Stop() ทันทีหลังจากสร้าง

วนอ่านค่าจากช่องสัญญาณ

คุณสามารถวนอ่านค่าจากช่องสัญญาณของตัวส่งสัญญาณตามช่วงเวลาเพื่อโต้ตอบกับแต่ละสัญญาณได้

for t := range ticker.C {
    fmt.Println("tick at", t)
}

หยุดการทำงานด้วยการเลือก

ใช้ตัวส่งสัญญาณตามช่วงเวลาร่วมกับช่องสัญญาณเสร็จสิ้น เพื่อให้ลูปออกจากการทำงานได้อย่างเรียบร้อย

for {
    select {
    case <-ticker.C:
        doWork()
    case <-done:
        return
    }
}

Ticker เทียบกับตัวจับเวลา

ความแตกต่างสำคัญ:

  • ตัวจับเวลาส่งสัญญาณครั้งเดียวหลังจากหน่วงเวลา
  • Tickerส่งสัญญาณซ้ำ ๆ ตามช่วงเวลา

ใช้ตัวจับเวลาสำหรับการหมดเวลาครั้งเดียว และใช้ Ticker สำหรับงานที่ทำเป็นระยะ

ความสะดวกของ time.Tick

time.Tick(d) ส่งคืนเฉพาะช่องสัญญาณเท่านั้น สะดวกแต่ไม่สามารถหยุดได้ จึงเกิดการรั่วไหลหากใช้ในโปรแกรมที่ทำงานเป็นเวลานาน ควรใช้ NewTicker แทนเมื่อไม่ใช่เพียงสคริปต์สั้น ๆ

for range time.Tick(time.Second) {
    // simple, but cannot Stop -> avoid in servers
}

การจัดการงานที่ทำงานช้า

หากงานของคุณใช้เวลานานกว่าช่วงเวลา สัญญาณจะไม่ถูกเข้าคิว ตัวส่งสัญญาณตามช่วงเวลาจะทิ้งสัญญาณแทนการส่งออกมาพร้อมกันเป็นชุด ดังนั้นคุณจะไม่มีงานค้าง แต่ภายใต้ภาระงานสูงอาจพลาดบางจังหวะไป

การปรับอัตรา

หากต้องการเปลี่ยนช่วงเวลา ให้สร้างตัวส่งสัญญาณตามช่วงเวลาใหม่ Go 1.15 ขึ้นไปยังมี ticker.Reset(d) ซึ่งเปลี่ยนคาบเวลาได้โดยไม่ต้องจัดสรรใหม่

ticker.Reset(500 * time.Millisecond)

การยกเลิกบริบท

ในบริการจริง ให้ควบคุมลูปของตัวส่งสัญญาณตามช่วงเวลาด้วย context.Context เพื่อให้สัญญาณปิดระบบหยุดลูปได้อย่างเรียบร้อย

case <-ctx.Done():
    return ctx.Err()

ตัวอย่างที่เรียกใช้ได้: ตัวส่งสัญญาณตามอัตราคงที่

โปรแกรมแบบทำงานได้ในตัวนี้ส่งสัญญาณสามครั้งตามช่วงเวลาคงที่ แล้วหยุดอย่างเรียบร้อยโดยใช้ตัวนับ

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(10 * time.Millisecond)
    defer ticker.Stop()
    count := 0
    for range ticker.C {
        count++
        fmt.Println("tick", count)
        if count == 3 {
            break
        }
    }
    fmt.Println("done")
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับตัวส่งสัญญาณตามช่วงเวลา

สรุปทบทวน

คุณได้เรียนรู้เกี่ยวกับตัวส่งสัญญาณตามช่วงเวลา:

  • time.NewTicker(d) ส่งสัญญาณทุก ๆ d ผ่านช่องสัญญาณ C
  • ใช้ defer ticker.Stop() เสมอเพื่อป้องกันการรั่วไหล
  • ตัวส่งสัญญาณตามช่วงเวลาจะทิ้งสัญญาณเมื่อทำงานช้า แทนที่จะส่งสัญญาณออกมาพร้อมกันเป็นชุด
  • ใช้ Reset เพื่อเปลี่ยนอัตรา และใช้บริบทหรือช่องสัญญาณเสร็จสิ้นเพื่อออกจากการทำงาน

คำถามที่พบบ่อย

บทเรียน “ตัวนับเวลาสำหรับช่วงเวลา” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวนับเวลาสำหรับช่วงเวลา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวนับเวลาสำหรับช่วงเวลา”

ทำซ้ำด้วยอัตราคงที่ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวนับเวลาสำหรับช่วงเวลา” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดเวลาตามเวลา
  2. ไลบรารี robfig/cron
  3. ตัวนับเวลาสำหรับช่วงเวลา
  4. การปิดงานอย่างราบรื่น
← กลับไปที่ Go Academy