Timeout attività

In questa pagina, ti introdurrò come impostare il timeout o la scadenza per un'attività e come gestire le operazioni di cancellazione.

Quando incolli un'attività usando Client, puoi specificare Timeout o Scadenza come opzione. Questo consente al server di abbandonare l'attività e recuperare risorse per altre attività se l'attività non viene elaborata prima del timeout o della scadenza.
Queste opzioni impostano il timeout o la scadenza del context.Context e lo passano come primo parametro al tuo gestore.

*Nota: Il timeout è relativo all'avvio del gestore per l'elaborazione dell'attività.

Ad esempio, se hai un'attività che deve essere completata entro 30 secondi, puoi impostare il timeout su 30*time.Second.

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

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

Se hai un'attività che deve essere completata entro una data specifica, puoi impostare la scadenza per l'attività.
Ad esempio, se hai un'attività che deve essere completata prima del 2020-12-25, puoi passarla come opzione Scadenza.

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

Context dell'attività nei gestori

Ora che abbiamo creato un'attività utilizzando le opzioni Timeout e Scadenza, dobbiamo rispettare questo valore leggendo il canale Done nel contesto.

Il primo parametro passato a Handler è context.Context. Dovresti scrivere il tuo gestore in modo che abbandoni il lavoro al ricevimento di un segnale di cancellazione dal contesto.

func mioGestore(ctx context.Context, task *asynq.Task) error {
    c := make(chan error, 1)
    go func() {
        c <- svolgiLavoro(task)
    }()
    select {
    case <-ctx.Done():
        // Ricevuto segnale di cancellazione, abbandona questo lavoro.
        return ctx.Err()
    case res := <-c:
        return res
    }   
}

Cancellazione attività tramite CLI

Il CLI asynq ha un comando cancel che può annullare l'ID di un'attività attiva.
Puoi usare il comando workers per controllare le attività attive attualmente e ottenere l'ID dell'attività da annullare.

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