Я хочу, чтобы определенное задание выполнялось только по одному. Другие типы задач можно запускать в параллельной рабочей среде.
Я не могу использовать пример сельдерея , так как я потеряю новое задание, если оно уже выполняется.
Я могу повторить попытку через некоторое время, но если между тем появляется новая задача (третья), и если первая уже завершена, то она будет запущена (а вторая все еще ждет), которую я не выполняю. не хочу Я хочу сохранить заказ.
Я знаю, что проще всего было бы иметь двух рабочих и две очереди. Один рабочий с> 1 параллелизмом, который наблюдает за очередью других задач, и один с только 1 параллелизмом, и он будет наблюдать за очередью только one_at_a_time
задач типа. Но я хочу использовать только одного работника с> 1 параллелизмом.
У меня есть подход, хранящий очередь непосредственно в redis
:
@app.task()
def one_at_a_time_task(arg):
if redis.queue.length == 0:
redis.queue.add(arg)
call_my_task()
else:
redis.queue.add(arg)
def call_my_task():
while(redis.queue.length > 0):
taskArgs = redis.queue.first
# actual task logic ...
redis.queue.dequeue
Мне придется поставить блокировку в очередь, чтобы условия гонки не возникали, но это выполнимо (я думаю).
Есть ли лучший / более простой способ, которым это можно сделать? Может быть, там, где мне не нужно поддерживать очередь и можно напрямую использовать очередь сельдерея?