Как я могу синхронизировать задачу сельдерея Django? - PullRequest
0 голосов
/ 04 июня 2018

У меня есть две задачи сельдерея

@app.task(bind=True)
def task1():

@app.task(bind=True)
def task2():

, и каждая задача вызывается различными API, например, следующим образом:

@api_view(['POST'])
@permission_classes((IsAuthenticated,))
def api1(request):
    task_1.delay()

@api_view(['POST'])
@permission_classes((IsAuthenticated,))
def api2(request):
    task_2.delay()

, если задача 2 вызывается, когда задача 1 выполняется в фоновом режиме, яхотите запустить задачу 2 после того, как задача 1 будет завершена

как я могу решить проблему ??

Я также рассматриваю возможность предоставления одной очереди для каждого пользователя

Пожалуйста, дайте мне идеальныйрешение ...

1 Ответ

0 голосов
/ 04 июня 2018

Ваша проблема состоит из двух подзадач:

  1. Убедитесь, что task2 не запускается при работе task1.Вы можете решить эту проблему путем реализации распределенной блокировки, например, с использованием Redis.
  2. Убедитесь, что task2 запускается после завершения task1.Это может быть решено путем повторной попытки task2, пока блокировка не станет доступной.

Вот некоторый псевдокод:

def task1():
    with distributed_lock():
        # do actual task

def task2():
    while not is_lock_available():
         self.retry()
    # do actual task

Естьпара деталей для рассмотрения:

  • что происходит, если task1 запускается, когда task1 уже запущен?
  • , что происходит, если task2 запускается, когда task2
  • какая задержка допустима до запуска ожидающего задания task2?
  • что произойдет, если запланировано другое задание task1 между task1 завершением и ожиданиемtask2 работа начинается?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...