مهلة الوقت للمهمة

في هذه الصفحة، سأقدم كيفية تعيين مهلة زمنية أو حد زمني لمهمة، وكيفية التعامل مع عمليات الإلغاء.

عند تسجيل مهمة باستخدام 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))

سياق المهمة في المعالجة

الآن بعد إنشاء مهمة باستخدام خيارات Timeout و Deadline، يجب علينا احترام هذه القيمة عن طريق قراءة قناة Done في السياق.

يتم تمرير المعامل الأول إلى Handler كـ context.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)

واجهة سطر الأوامر asynq تحتوي على أمر cancel الذي يمكن إلغاء هوية مهمة نشطة.
يمكنك استخدام أمر workers لفحص المهام النشطة حاليًا والحصول على هوية المهمة التي يجب إلغاؤها.

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