Limit czasu oczekiwania
W tej sekcji przedstawię, jak ustawić limit czasu oczekiwania lub termin wykonania zadania oraz jak obsługiwać operacje anulowania.
Podczas kolejkowania zadania za pomocą Client
, można określić Timeout
lub Deadline
jako opcję. Pozwala to serwerowi zrezygnować z zadania i odzyskać zasoby dla innych zadań, jeśli zadanie nie zostanie przetworzone przed upływem limitu czasu lub terminu wykonania.
Te opcje ustawiają limit czasu oczekiwania lub termin wykonania context.Context
i przekazują go jako pierwszy parametr do twojego konstruktora.
*Uwaga: Limit czasu jest względny względem czasu rozpoczęcia przetwarzania zadania.
Na przykład, jeśli masz zadanie, które musi zostać zakończone w ciągu 30 sekund, możesz ustawić limit czasu na 30*time.Second
.
c := asynq.NewClient(asynq.RedisClientOpt{Addr: ":6379"})
err := c.Enqueue(task, asynq.Timeout(30 * time.Second))
Jeśli masz zadanie, które musi zostać zakończone do określonego czasu, możesz ustawić termin wykonania zadania.
Na przykład, jeśli masz zadanie, które musi zostać zakończone przed 2020-12-25
, możesz przekazać to jako opcję Deadline
.
xmas := time.Date(2020, time.December, 25, 0, 0, 0, 0, time.UTC)
err := c.Enqueue(task, asynq.Deadline(xmas))
Kontekst zadania w konstruktorach
Teraz, gdy stworzyliśmy zadanie, używając opcji Timeout
i Deadline
, musimy szanować tę wartość, czytając kanał Done
w kontekście.
Pierwszy przekazany parametr do Handler
to context.Context
. Powinieneś napisać swój handler w taki sposób, aby porzucić pracę po otrzymaniu sygnału anulowania z kontekstu.
func myHandler(ctx context.Context, task *asynq.Task) error {
c := make(chan error, 1)
go func() {
c <- doWork(task)
}()
select {
case <-ctx.Done():
// Otrzymano sygnał anulowania, porzucenie pracy.
return ctx.Err()
case res := <-c:
return res
}
}
Anulowanie zadań za pomocą interfejsu wiersza poleceń
Interfejs wiersza poleceń asynq
posiada polecenie cancel
, które może anulować identyfikator aktywnego zadania.
Możesz użyć polecenia workers
, aby sprawdzić obecnie aktywne zadania i uzyskać identyfikator zadania do anulowania.
asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]