การหมดเวลางาน
ในหน้านี้ฉันจะแนะนำวิธีการตั้งค่าเวลาหมดเวลาหรือเวลาสุดท้ายสำหรับงาน และวิธีการจัดการการยกเลิกการดำเนินการ
เมื่อคิวงานโดยใช้ Client
คุณสามารถระบุ Timeout
หรือ Deadline
เป็นตัวเลือก ซึ่งทำให้เซิร์ฟเวอร์สามารถยกเลิกงานและยึดทรัพยากรสำหรับงานอื่น ๆ หากงานไม่ได้รับการประมวลผลก่อนหมดเวลาหรือเวลาสุดท้าย ตัวเลือกเหล่านี้จะตั้งค่าเวลาหมดเวลาหรือเวลาสุดท้ายของ context.Context
และส่งผ่านเป็นพารามิเตอร์แรกให้กับผู้ดำเนินการของคุณ
*หมายเหตุ: เวลาหมดเวลานี้เป็น สัมพัทธ์กับเวลาที่ผู้ดำเนินการเริ่มประมวลผลงาน
ตัวอย่างเช่น หากคุณมีงานที่ต้องเสร็จภายใน 30 วินาที คุณสามารถตั้งค่าเวลาหมดเวลาเป็น 30*time.Second
c := asynq.NewClient(asynq.RedisClientOpt{Addr: ":6379"})
err := c.Enqueue(task, asynq.Timeout(30 * time.Second))
หากคุณมีงานที่ต้องเสร็จก่อนเวลาที่ระบุ คุณสามารถตั้งเวลาสุดท้ายสำหรับงาน เช่นหากคุณมีงานที่ต้องเสร็จก่อนวันที่ 2020-12-25
คุณสามารถส่งมันเป็นตัวเลือก Deadline
xmas := time.Date(2020, time.December, 25, 0, 0, 0, 0, time.UTC)
err := c.Enqueue(task, asynq.Deadline(xmas))
Context ของงานในตัวดำเนินการ
ตอนนี้เมื่อเราสร้างงานโดยใช้ตัวเลือก Timeout
และ Deadline
เราต้องปฏิบัติตามค่านี้ด้วยการอ่านช่อง Done
ใน context
พารามิเตอร์แรกที่ส่งให้กับ Handler
คือ context.Context
คุณควรเขียนโค้ดของคุณในตัวดำเนินการในลักษณะที่ยกเลิกงานเมื่อได้รับสัญญาณยกเลิกจาก context
func myHandler(ctx context.Context, task *asynq.Task) error {
c := make(chan error, 1)
go func() {
c <- doWork(task)
}()
select {
case <-ctx.Done():
// ได้รับสัญญาณยกเลิก, ยกเลิกงานนี้
return ctx.Err()
case res := <-c:
return res
}
}
การยกเลิกงานผ่าน CLI
CLI ของ asynq
มีคำสั่ง cancel
ที่สามารถยกเลิก ID ของงานที่กำลังทำงานอยู่ คุณสามารถใช้คำสั่ง workers
เพื่อตรวจสอบงานที่กำลังทำงานอยู่และรับ ID ของงานที่ต้องการยกเลิก
asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]