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]