Наименее плохой способ спать в представлении Джанго - PullRequest
4 голосов
/ 23 сентября 2019

У меня есть синхронный API в Django, который делает несколько внешних запросов.По соображениям производительности, я устарею и переключусь на асинхронную модель: запрос вызовет несколько подзадач сельдерея, и клиенту придется получать статус задачи, пока она не будет завершена.

Однако я не могу получитьизбавиться от существующего API сразу же, так как нам нужно обеспечить обратную совместимостьЧтобы это работало, я намерен реализовать синхронную оболочку вокруг моих асинхронных задач.Это то, что должен делать обратно совместимый API, по моему мнению:

  • запуск асинхронных задач
  • sleep
  • обновление объекта, выход, если он завершен
  • или цикл

Что-то вроде:

task = MyTask.objects.create(...).run() # Will span multiple parallel sub-tasks
while task.is_ongoing(): # Check if all sub-tasks are completed
    sleep(1)
    task.refresh_from_db()

Конечно, спать с точки зрения Джанго очень плохо, но я не думаю, что есть другой способчтобы обеспечить обратную совместимость с моим синхронным API.Если бы Django действительно поддерживал async, было бы лучше, но я не нашел способа приостановить текущий поток, не блокируя все.Конечно, я мог запускать все задачи синхронно в синхронном API, но это лишило бы цели распараллеливания «длительных» задач (по несколько секунд каждая).

Отсюда два моих вопроса:

  • Есть ли другой способ?
  • Какой наименее плохой способ спать в основной теме Django?Это sleep или есть несколько лучшие варианты?

1 Ответ

1 голос
/ 23 сентября 2019

Один из лучших способов, чем sleep и цикл - использовать Task.apply для запуска задач сельдерея, а не apply_async.apply будет блокироваться до завершения задания.

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