Как использовать Celery в качестве приоритетной очереди?

Я использую Celery для обработки фоновых заданий, которые используют блокирующий API для веб-приложения Django. Поскольку API может обрабатывать только одно задание за раз, я также использую блокировку (реализованную с помощью Redis), чтобы гарантировать, что только одно задание выполняется одновременно. У меня есть задания с разными приоритетами, и мне интересно, нужно ли мне самому реализовать сортировку по приоритетам, или же celery или Redis уже предоставляют очередь с приоритетами, которая может быть более устойчивой к условиям гонки.

Лучше всего, если бы у меня также была возможность для текущего задания проверить, не находится ли в очереди что-то с более высоким приоритетом, и затем решить, следует ли ему отменить текущую операцию и вернуть ее в очередь.

Текущий код (без приоритетов и отмены задач) выглядит так:

from celery import shared_task
from django.core.cache import cache


@celery.shared_task
def my_task(data1, data2):
  with cache.lock("my_task"):
    use_api(data1)
    # here the task could cancel itself
    use_api(data2)

def some_view(request):
  my_task.delay(data1=request.GET.get("data1"),
                data2=request.GET.get("data2"))
Вернуться на верх