Batas Waktu Tugas
Pada halaman ini, saya akan memperkenalkan bagaimana cara menetapkan batas waktu atau tenggat waktu untuk tugas, dan bagaimana cara menangani operasi pembatalan.
Saat mengantri tugas menggunakan Client
, Anda dapat menentukan Timeout
atau Deadline
sebagai opsi. Hal ini memungkinkan server untuk mengabaikan tugas dan mereklamasi sumber daya untuk tugas lain jika tugas tersebut tidak diproses sebelum batas waktu atau tenggat waktu.
Opsi ini akan menetapkan batas waktu atau tenggat waktu dari context.Context
dan meneruskannya sebagai parameter pertama ke handler Anda.
*Catatan: Batas waktu relatif terhadap saat handler mulai memproses tugas.
Sebagai contoh, jika Anda memiliki tugas yang perlu diselesaikan dalam waktu 30 detik, Anda dapat menetapkan batas waktu sebagai 30 * time.Second
.
c := asynq.NewClient(asynq.RedisClientOpt{Addr: ":6379"})
err := c.Enqueue(task, asynq.Timeout(30 * time.Second))
Jika Anda memiliki tugas yang perlu diselesaikan pada waktu tertentu, Anda dapat menetapkan tenggat waktu untuk tugas tersebut.
Sebagai contoh, jika Anda memiliki tugas yang perlu diselesaikan sebelum 2020-12-25
, Anda dapat meneruskannya sebagai opsi Deadline
.
natal := time.Date(2020, time.December, 25, 0, 0, 0, 0, time.UTC)
err := c.Enqueue(task, asynq.Deadline(natal))
Konteks Tugas dalam Handler
Sekarang setelah kita telah membuat tugas menggunakan opsi Timeout
dan Deadline
, kita harus menghormati nilai ini dengan membaca saluran Done
dalam konteks.
Parameter pertama yang dilewati ke Handler
adalah context.Context
. Anda harus menulis handler Anda sedemikian rupa sehingga pekerjaan ditinggalkan saat menerima sinyal pembatalan dari konteks.
func myHandler(ctx context.Context, task *asynq.Task) error {
c := make(chan error, 1)
go func() {
c <- doWork(task)
}()
select {
case <-ctx.Done():
// Sinyal pembatalan diterima, tinggalkan pekerjaan ini.
return ctx.Err()
case res := <-c:
return res
}
}
Membatalkan Tugas via CLI
CLI asynq
memiliki perintah cancel
yang dapat membatalkan ID tugas yang sedang aktif.
Anda dapat menggunakan perintah workers
untuk memeriksa tugas yang sedang aktif dan mendapatkan ID tugas yang akan dibatalkan.
asynq task ls --queue=myqueue --state=active
asynq task cancel [task_id]