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]