Đặt thời gian chờ

Trong trang này, tôi sẽ giới thiệu cách đặt thời gian chờ hoặc hạn cuối cho một nhiệm vụ, và cách xử lý thao tác hủy bỏ.

Khi đặt một nhiệm vụ bằng cách sử dụng Client, bạn có thể chỉ định Timeout hoặc Deadline như một tùy chọn. Điều này cho phép máy chủ từ bỏ nhiệm vụ và thu hồi tài nguyên cho các nhiệm vụ khác nếu nhiệm vụ không được xử lý trước khi hết thời gian chờ hoặc hạn cuối.
Các tùy chọn này sẽ đặt thời gian chờ hoặc hạn cuối của context.Context và truyền nó như tham số đầu tiên vào bộ xử lý của bạn.

*Lưu ý: Thời gian chờ là tương đối với khi bộ xử lý bắt đầu xử lý nhiệm vụ.

Ví dụ, nếu bạn có một nhiệm vụ cần hoàn thành trong vòng 30 giây, bạn có thể đặt thời gian chờ là 30*time.Second.

c := asynq.NewClient(asynq.RedisClientOpt{Addr: ":6379"})

err := c.Enqueue(task, asynq.Timeout(30 * time.Second))

Nếu bạn có một nhiệm vụ cần hoàn thành trước một thời gian cụ thể, bạn có thể đặt hạn cuối cho nhiệm vụ.
Ví dụ, nếu bạn có một nhiệm vụ cần hoàn thành trước 25/12/2020, bạn có thể truyền nó như một tùy chọn Deadline.

xmas := time.Date(2020, time.December, 25, 0, 0, 0, 0, time.UTC)
err := c.Enqueue(task, asynq.Deadline(xmas))

Ngữ cảnh của Nhiệm vụ trong Bộ xử lý

Bây giờ khi chúng ta đã tạo một nhiệm vụ bằng cách sử dụng các tùy chọn TimeoutDeadline, chúng ta phải tôn trọng giá trị này bằng cách đọc kênh Done trong ngữ cảnh.

Tham số đầu tiên được truyền vào Handlercontext.Context. Bạn nên viết bộ xử lý của mình sao cho bỏ việc khi nhận được tín hiệu hủy từ ngữ cảnh.

func myHandler(ctx context.Context, task *asynq.Task) error {
    c := make(chan error, 1)
    go func() {
        c <- doWork(task)
    }()
    select {
    case <-ctx.Done():
        // Nhận được tín hiệu hủy, bỏ việc này.
        return ctx.Err()
    case res := <-c:
        return res
    }   
}

Hủy Nhiệm vụ qua CLI

CLI asynq có một lệnh cancel có thể hủy ID của một nhiệm vụ hoạt động.
Bạn có thể sử dụng lệnh workers để kiểm tra các nhiệm vụ đang hoạt động và lấy ID của nhiệm vụ cần hủy.

asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]