1. การแนะนำ
ไลบรารี Golang cron เป็นเครื่องมือที่มีประสิทธิภาพและใช้ง่ายที่ช่วยให้เราสามารถกำหนดตารางงานให้ทำงานตามเวลาหรือช่วงเวลาที่กำหนดไว้ มันถูกออกแบบมาจาก UNIX cron service แต่ถูกนำมาสร้างเป็นไลบรารีที่สามารถนำมาใช้ร่วมกับแอปพลิเคชัน Go ได้โดยตรง ไลบรารี cron จะดูแลการกำหนดเวลาอย่างง่าย ทำให้คุณสามารถใช้เวลาในการติดตามงานที่ต้องการประมวลผลได้
2. ตัวอย่าง
การติดตั้งไลบรารี cron
เพื่อเริ่มต้นการใช้งานไลบรารี cron ในโปรเจกต์ของคุณ คุณจำเป็นต้องทำการติดตั้งก่อนด้วยคำสั่ง go get
:
go get github.com/robfig/cron/[email protected]
นำเข้าแพ็กเกจ cron
หลังจากที่ติดตั้งแล้ว คุณสามารถนำเข้าไลบรารีเข้าไปในโปรแกรม Go ของคุณได้ดังนี้:
import "github.com/robfig/cron/v3"
นี่คือตัวอย่างง่ายๆ ของวิธีการตั้งค่างาน Cron ที่พิมพ์ข้อความทุกๆ 1 นาที:
package main
import (
"fmt"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
c.AddFunc("0 30 * * * *", func() { fmt.Println("ทุกๆ 1 ชั่วโมงที่ครึ่ง") })
c.AddFunc("@hourly", func() { fmt.Println("ทุกๆ 1 ชั่วโมง") })
c.AddFunc("@every 1h30m", func() { fmt.Println("ทุกๆ 1 ชั่วโมง 30 นาที") })
c.Start()
..
// Funcs are invoked in their own goroutine, asynchronously.
...
// Funcs may also be added to a running Cron
c.AddFunc("@daily", func() { fmt.Println("ทุกวัน") })
..
..
c.Stop() // หยุดตาราง (ไม่หยุดงานที่กำลังทำงาน)
}
3. รูปแบบของนิพจน์ CRON
นิพจน์ cron แสดงถึงชุดของเวลา โดยใช้รูปแบบ 6 ฟิลด์ที่คั่นด้วยเว้นวรรค
ชื่อฟิลด์ | บังคับ? | ค่าที่อนุญาต | อักขระพิเศษที่อนุญาต |
---|---|---|---|
วินาที | ใช่ | 0-59 | * / , - |
นาที | ใช่ | 0-59 | * / , - |
ชั่วโมง | ใช่ | 0-23 | * / , - |
วันของเดือน | ใช่ | 1-31 | * / , - ? |
เดือน | ใช่ | 1-12 หรือ JAN-DEC | * / , - |
วันของสัปดาห์ | ใช่ | 0-6 หรือ SUN-SAT | * / , - ? |
4. อักขระพิเศษในนิพจน์ CRON
- ดอกจัน ( * ) ดอกจันแทนค่าทุกอย่างที่เป็นไปได้สำหรับฟิลด์ที่กำหนด ตัวอย่างเช่น ดอกจันในฟิลด์ของนาทีหมายความว่าทุกนาที
- เครื่องหมายชาก ( / ) เครื่องหมายชากใช้สำหรับระบุการเพิ่มขึ้น เช่น "*/15" ในฟิลด์ของวินาทีหมายถึงทุก 15 วินาทีตั้งแต่ 0 วินาที
- จุลภาค ( , ) อักขระจุลภาคถูกใช้สำหรับรายการค่าหลายค่าเป็นค่าต่อๆ ไป เช่น "MON,WED,FRI" ในฟิลด์ของวันของสัปดาห์หมายถึงงานจะทำงานในวันจันทร์, พุธ, ศุกร์
- ขีด ( - ) ขีดแท้ให้ช่วงของค่า "9-17" ในฟิลด์ของชั่วโมงหมายถึงทุกชั่วโมงตั้งแต่ 9 โมง เที่ยงถึง 5 โมง เย็น
- เครื่องหมายคำถาม ( ? ) เครื่องหมายคำถามสามารถใช้ในฟิลด์ของวันของเดือนและวันของสัปดาห์เพื่อแสดง 'ไม่มีค่าที่เฉพาะเจาะจง', ซึ่งเป็นประโยชน์เมื่อคุณต้องการระบุค่าสำหรับฟิลด์หนึ่งและไม่ใช่อีกฟิลด์หนึ่ง
5. การตั้งค่าพรีเดิฟายสเก๊ด
อธิบายอย่างละเอียดเกี่ยวกับการตั้งค่าพรีเดิฟายสเก๊ดที่มีให้ใช้อยู่แสดงเป็นตารางดังนี้:
รายการ | คำอธิบาย | เทียบเท่ากับ |
---|---|---|
@yearly (หรือ @annually) | ทำงานครั้งในปีเดียว เที่ยงคืน วันที่ 1 มกราคม | 0 0 0 1 1 * |
@monthly | ทำงานครั้งในเดือนเดียว เที่ยงคืน วันแรกของเดือน | 0 0 0 1 * * |
@weekly | ทำงานครั้งในสัปดาห์เดียว เที่ยงคืนระหว่างวันเสาร์/อาทิตย์ | 0 0 0 * * 0 |
@daily (หรือ @midnight) | ทำงานครั้งในทุกวัน เที่ยงคืน | 0 0 0 * * * |
@hourly | ทำงานครั้งในทุกชั่วโมง เริ่มต้นที่ชั่วโมงที่ 0 | 0 0 * * * * |
6. ช่วงเวลาและกำหนดเวลาที่คงที่ในการทำงาน
การกำหนดงานให้ทำงานในช่วงเวลาที่คงที่เป็นคุรสำคัญอีกอย่างหนึ่งของไลบรารี cron ยกตัวอย่างเช่น การกำหนดงานที่ทำงานทุก 2 ชั่วโมง:
c.AddFunc("@every 2h", func() { fmt.Println("งานทำงานทุกสองชั่วโมง") })
7. โซนเวลาและการกำหนดงาน
การตีความและกำหนดเวลาทำงานจะถูกทำที่โซนเวลาท้องถิ่นของเครื่องที่มีการรันแอปพลิเคชัน Go ให้ระมัดระวังในขณะที่มีการเปลี่ยนเวลาออก การมีเวลาบางช่วงสามารถจะไม่มีอยู่หรือถูกทำซ้ำ
8. ความปลอดภัยของเธรดและการซิงค์
ไลบรารี cron ถูกออกแบบมาให้สามารถป้องกันการแข่งขันของเธรดและการทำงานพร้อมกันได้เป็นอย่างมาก สำคัญมากสำหรับผู้เรียกใช้ที่จะรักษาระเบียบการเรียกใช้อย่างถูกต้องเพื่อหลีกเลี่ยงเงื่อนไขแข่งขัน การใช้กลไวฯการซิงค์ที่ถูกต้องจะต้องถูกใช้งานเมื่อจำเป็นเพื่อให้แน่ใจว่างานได้ถูกกำหนดและทำงานอย่างถูกต้อง