Установка времени ожидания выполнения задачи

На этой странице я расскажу, как установить время ожидания или крайний срок выполнения задачи, а также как обрабатывать операции отмены.

При постановке задачи с использованием 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]