Как выполнить только одну задачу за один раз в сельдерее, не теряя ее и поддерживая порядок задач в очереди - PullRequest
0 голосов
/ 27 июня 2018

Я хочу, чтобы определенное задание выполнялось только по одному. Другие типы задач можно запускать в параллельной рабочей среде.

Я не могу использовать пример сельдерея , так как я потеряю новое задание, если оно уже выполняется.

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

Я знаю, что проще всего было бы иметь двух рабочих и две очереди. Один рабочий с> 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

Мне придется поставить блокировку в очередь, чтобы условия гонки не возникали, но это выполнимо (я думаю).

Есть ли лучший / более простой способ, которым это можно сделать? Может быть, там, где мне не нужно поддерживать очередь и можно напрямую использовать очередь сельдерея?

...