زمان سپرده کار
در این صفحه، من به شما چگونگی تنظیم زمان سپرده یا مهلت یک کار و چگونگی رسیدگی به عملیات لغو را معرفی خواهم کرد.
زمانی که از 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]