زمان سپرده کار

در این صفحه، من به شما چگونگی تنظیم زمان سپرده یا مهلت یک کار و چگونگی رسیدگی به عملیات لغو را معرفی خواهم کرد.

زمانی که از Client برای قرار دادن یک کار در صف استفاده می کنید، می توانید Timeout یا Deadline را به عنوان یک گزینه مشخص کنید. این کار به سرور اجازه می دهد که از کار صرفنظر کند و منابع را برای کارهای دیگر بازیابی کند اگر کار قبل از زمان سپرده یا مهلت پردازش نشود.
این گزینه ها زمان سپرده یا مهلت context.Context را تنظیم می کنند و با ارسال آن به عنوان پارامتر اول به دستگاه شما می گذارند.

*توجه: زمان سپرده نسبت به زمان شروع پردازش دستگاه می باشد.

به عنوان مثال، اگر یک کار دارید که باید در 30 ثانیه انجام شود، می توانید زمان سپرده را به 30*time.Second تنظیم کنید.

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

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

اگر یک کار دارید که باید تا زمان مشخصی انجام شود، می توانید مهلت برای کار تنظیم کنید.
به عنوان مثال، اگر یک کار دارید که قبل از 2020-12-25 باید انجام شود، می توانید آن را به عنوان گزینه Deadline ارسال کنید.

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

Context کار در دستگاه ها

اکنون که یک کار با استفاده از گزینه های Timeout و Deadline ایجاد کردیم، باید از این مقدار با خواندن کانال Done در context احترام بگذاریم.

پارامتر اولیه ارسال شده به Handler، context.Context می باشد. باید handler خود را به گونه ای بنویسید که کار را در صورت دریافت سیگنال لغو از context ترک کند.

func myHandler(ctx context.Context, task *asynq.Task) error {
    c := make(chan error, 1)
    go func() {
        c <- doWork(task)
    }()
    select {
    case <-ctx.Done():
        // سیگنال لغو دریافت شد، این کار را ترک کنید.
        return ctx.Err()
    case res := <-c:
        return res
    }   
}

لغو کارها از طریق خط فرمان CLI

CLI asynq دارای دستور cancel است که می تواند شناسه یک کار فعال را لغو کند.
می توانید از دستور workers برای بررسی کارهای فعال فعلی و گرفتن شناسه کار برای لغو استفاده کنید.

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