작업 시간 제한
이 페이지에서는 작업의 시간 제한 또는 데드라인을 설정하고 취소 작업을 처리하는 방법을 소개합니다.
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))
처리기 내 작업 취소
이제 Timeout
및 Deadline
옵션을 사용하여 작업을 생성했으므로, 해당 값을 Done
채널에서 읽어서 존중해야 합니다.
Handler
에 전달되는 첫 번째 매개변수는 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를 통한 작업 취소
asynq
CLI에는 활성 작업의 ID를 취소할 수 있는 cancel
명령이 있습니다.
현재 활성 작업을 확인하고 취소할 작업의 ID를 얻을 수 있도록 workers
명령을 사용할 수 있습니다.
asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]