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 ถูกออกแบบมาให้สามารถป้องกันการแข่งขันของเธรดและการทำงานพร้อมกันได้เป็นอย่างมาก สำคัญมากสำหรับผู้เรียกใช้ที่จะรักษาระเบียบการเรียกใช้อย่างถูกต้องเพื่อหลีกเลี่ยงเงื่อนไขแข่งขัน การใช้กลไวฯการซิงค์ที่ถูกต้องจะต้องถูกใช้งานเมื่อจำเป็นเพื่อให้แน่ใจว่างานได้ถูกกำหนดและทำงานอย่างถูกต้อง