1. Giới thiệu
Thư viện cron của Golang là một công cụ mạnh mẽ và dễ sử dụng cho việc lập lịch chạy các công việc vào thời gian cụ thể hoặc theo khoảng thời gian. Nó được mô hình theo dịch vụ cron của UNIX nhưng được triển khai như một thư viện độc lập có thể tích hợp vào ứng dụng Go. Thư viện cron chủ động quản lý lập lịch dựa trên thời gian, giúp bạn tập trung vào công việc cần thực hiện.
2. Ví dụ
Cài đặt thư viện cron
Để bắt đầu sử dụng thư viện cron trong dự án của bạn, bạn cần cài đặt nó bằng lệnh go get
như sau:
go get github.com/robfig/cron/[email protected]
Nhập gói cron
Sau khi cài đặt, bạn có thể nhập nó vào chương trình Go của bạn như sau:
import "github.com/robfig/cron/v3"
Dưới đây là một ví dụ đơn giản về cách thiết lập một công việc Cron để in ra một thông báo mỗi phút:
package main
import (
"fmt"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
c.AddFunc("0 30 * * * *", func() { fmt.Println("Mỗi giờ vào phút thứ ba mươi") })
c.AddFunc("@hourly", func() { fmt.Println("Mỗi giờ") })
c.AddFunc("@every 1h30m", func() { fmt.Println("Mỗi giờ ba mươi") })
c.Start()
..
// Các Funcs được gọi riêng biệt trong goroutine của chúng, không đồng bộ.
...
// Các Funcs cũng có thể được thêm vào một Cron đang chạy
c.AddFunc("@daily", func() { fmt.Println("Mỗi ngày") })
..
..
c.Stop() // Dừng lập lịch (không dừng bất kỳ công việc nào đang chạy).
}
3. Định dạng Biểu thức CRON
Một biểu thức cron đại diện cho một tập hợp các thời gian, sử dụng 6 trường được phân tách bằng dấu cách.
Tên trường | Bắt buộc? | Giá trị cho phép | Ký tự đặc biệt cho phép |
---|---|---|---|
Giây | Có | 0-59 | * / , - |
Phút | Có | 0-59 | * / , - |
Giờ | Có | 0-23 | * / , - |
Ngày trong tháng | Có | 1-31 | * / , - ? |
Tháng | Có | 1-12 hoặc JAN-DEC | * / , - |
Ngày trong tuần | Có | 0-6 hoặc SUN-SAT | * / , - ? |
4. Ký tự Đặc biệt trong Biểu thức CRON
- Dấu hoa thị ( * ) Dấu hoa thị biểu thị tất cả các giá trị có thể cho trường được chỉ định. Ví dụ, dấu hoa thị trong trường phút biểu thị mỗi phút.
- Dấu gạch chéo ( / ) Ký tự gạch chéo được sử dụng để chỉ định các bước tăng. Ví dụ, "*/15" trong trường giây có nghĩa là mỗi 15 giây bắt đầu từ không.
- Dấu phẩy ( , ) Ký tự phẩy được sử dụng để liệt kê nhiều giá trị riêng lẻ. Ví dụ, "THỨ HAI,THỨ TƯ,THỨ SÁU" trong trường ngày của tuần có nghĩa là công việc sẽ chạy vào thứ hai, thứ tư và thứ sáu.
- Dấu gạch ngang ( - ) Dấu gạch ngang biểu thị một dãy giá trị. "9-17" trong trường giờ biểu thị mỗi giờ từ 9 giờ sáng đến 5 giờ chiều.
- Dấu hỏi ( ? ) Dấu hỏi có thể được sử dụng trong trường ngày trong tháng và ngày trong tuần để biểu thị 'không giá trị cụ thể', có ích khi bạn cần chỉ định một giá trị cho một trường và không phải trường kia.
5. Lịch trình Định sẵn
Giải thích chi tiết về các lịch trình được định sẵn có sẵn, được hiển thị dưới dạng bảng:
Nhập vào | Mô tả | Tương đương với |
---|---|---|
@yearly (hoặc @annually) | Chạy một lần mỗi năm, nửa đêm, ngày 1 tháng 1 | 0 0 0 1 1 * |
@monthly | Chạy một lần mỗi tháng, nửa đêm, ngày đầu tiên của tháng | 0 0 0 1 * * |
@weekly | Chạy một lần mỗi tuần, nửa đêm giữa thứ Bảy/Chủ Nhật | 0 0 0 * * 0 |
@daily (hoặc @midnight) | Chạy một lần mỗi ngày, nửa đêm | 0 0 0 * * * |
@hourly | Chạy một lần mỗi giờ, đầu giờ | 0 0 * * * * |
6. Khoảng và Lập Lịch Khoảng Cố Định
Lập lịch cho các công việc chạy theo khoảng cố định là một tính năng mạnh mẽ khác của thư viện cron. Ví dụ, để lập lịch một công việc chạy mỗi 2 giờ:
c.AddFunc("@every 2h", func() { fmt.Println("Công việc chạy mỗi hai giờ") })
7. Múi Giờ và Lập Lịch Công Việc
Phân tích và lập lịch được thực hiện trong múi giờ địa phương của máy chạy ứng dụng Go. Cần chú ý trong thời gian chuyển đổi giờ mùa hè, vì một số thời gian có thể không tồn tại hoặc được lặp lại.
8. An Toàn Luồng và Đồng Bộ Hóa
Thư viện cron được thiết kế để an toàn đối với luồng và đồng thời. Điều quan trọng đối với người gọi là duy trì một trình tự đúng đắn của việc gọi phương thức để tránh tình trạng cạnh tranh. Các cơ chế đồng bộ hóa đúng đắn phải được sử dụng khi cần thiết để đảm bảo việc lập lịch và thực thi công việc đúng cách.