ตัวนับเวลาสำหรับช่วงเวลา
ทำซ้ำด้วยอัตราคงที่
ตัวนับเวลาสำหรับช่วงเวลา เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดเวลาตามเวลา
- ไลบรารี robfig/cron
- ตัวนับเวลาสำหรับช่วงเวลา
- การปิดงานอย่างราบรื่น