Установка времени ожидания выполнения задачи
На этой странице я расскажу, как установить время ожидания или крайний срок выполнения задачи, а также как обрабатывать операции отмены.
При постановке задачи с использованием 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
есть команда cancel
, которая может отменить идентификатор активной задачи.
Вы можете использовать команду workers
, чтобы проверить текущие активные задачи и получить идентификатор задачи для отмены.
asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]