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 0-59 * / , -
Phút 0-59 * / , -
Giờ 0-23 * / , -
Ngày trong tháng 1-31 * / , - ?
Tháng 1-12 hoặc JAN-DEC * / , -
Ngày trong tuần 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.