การหมดเวลางาน

ในหน้านี้ฉันจะแนะนำวิธีการตั้งค่าเวลาหมดเวลาหรือเวลาสุดท้ายสำหรับงาน และวิธีการจัดการการยกเลิกการดำเนินการ

เมื่อคิวงานโดยใช้ 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]