У меня есть синхронный 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
или есть несколько лучшие варианты?