Как использовать 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"))