Tiempo de espera de tarea

En esta página, presentaré cómo establecer el tiempo de espera o plazo para una tarea, y cómo manejar las operaciones de cancelación.

Al encolar una tarea utilizando Client, puedes especificar Timeout o Deadline como opción. Esto permite que el servidor abandone la tarea y reclame recursos para otras tareas si la tarea no se procesa antes del tiempo de espera o del plazo. Estas opciones establecerán el tiempo de espera o el plazo del context.Context y lo pasarán como el primer parámetro a tu manejador.

*Nota: El tiempo de espera es relativo al momento en que el manejador comienza a procesar la tarea.

Por ejemplo, si tienes una tarea que debe completarse en 30 segundos, puedes establecer el tiempo de espera en 30*time.Second.

c := asynq.NewClient(asynq.RedisClientOpt{Addr: ":6379"})

err := c.Enqueue(task, asynq.Timeout(30 * time.Second))

Si tienes una tarea que debe completarse para una hora específica, puedes establecer el plazo para la tarea. Por ejemplo, si tienes una tarea que debe completarse antes del 25 de diciembre de 2020, puedes pasarlo como opción de Deadline.

xmas := time.Date(2020, time.December, 25, 0, 0, 0, 0, time.UTC)
err := c.Enqueue(task, asynq.Deadline(xmas))

Contexto de tarea en los manejadores

Ahora que hemos creado una tarea utilizando las opciones Timeout y Deadline, debemos respetar este valor leyendo el canal Done en el contexto.

El primer parámetro pasado a Handler es context.Context. Debes escribir tu manejador de tal manera que abandone el trabajo al recibir una señal de cancelación del contexto.

func myHandler(ctx context.Context, task *asynq.Task) error {
    c := make(chan error, 1)
    go func() {
        c <- doWork(task)
    }()
    select {
    case <-ctx.Done():
        // Se recibió la señal de cancelación, abandonar este trabajo.
        return ctx.Err()
    case res := <-c:
        return res
    }   
}

Cancelar tareas a través de la línea de comandos (CLI)

La CLI de asynq tiene un comando cancel que puede cancelar el ID de una tarea activa. Puedes usar el comando workers para verificar las tareas activas actualmente y obtener el ID de la tarea a cancelar.

asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]