Как использовать asyncio с django rest api framework так, как jquery обещает работать, чтобы ответы не ждали - PullRequest
0 голосов
/ 15 января 2020

Я на python 3,7 с django 2.2.3 работает. Мне нужно решение с asyncio, чтобы API мог просто вызывать функцию asyn c и возвращать ответ, не дожидаясь, как мы поступим с обещаниями jquery. определение my_coro только для примера. Я буду запускать moviepy функции, которые обычно требуют 40-50 секунд для завершения. Я не хочу, чтобы API долго ждал отправки ответа. Я также запутался в том, как обращаться с пулом потоков. как использовать пул потоков здесь? потому что я намерен также сделать итерации фильма быстрыми. Итак, как создать пул для обработки вызовов my_coro?

async def my_coro(n):
    print(f"The answer is {n}.")

async def main(): 
    await asyncio.gather(my_coro(1),my_coro(2),my_coro(3),my_coro(4))

class SaveSnaps(APIView):
    def post(self, request, format = None):
        if request.user.is_anonymous:
            return Response({"response":"FORBIDDEN"}, status = 403)
        else:
            try:
                asyncio.run(main())
                return Response({"response": "success"}, status = 200)
            except Exception as e:
                return Response({'response':str(e)}, status = 400) 

Обновление: Я пытался использовать сельдерей. но так как я не буду использовать periodi c tasks & фактически метод, который мне нужно сделать асинхронным, получает массив BLOB-объектов в качестве параметра. task.delay из сельдерея дает мне ошибку, потому что задачи ожидают сериализуемые параметры. Так что я вернулся к исходной точке по этому вопросу. Я не уверен, стоит ли мне придерживаться решения для многопоточности или чего-то еще.

Обновление: Я забыл поделиться тем, что я наконец сделал. Я перешел на celery. но поскольку celery task.delay ожидают serialized params, я переместил сохраняющую часть blob в синхронный метод, который после завершения передает задачи moviepy в задачу celery run.

1 Ответ

1 голос
/ 15 января 2020

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

Если вы хотите, чтобы ваше приложение запускало код в фоновом режиме и продолжало выполнение, аналогично Обещаниям в JS, вам необходимо рассмотреть возможность использования Job Планирование с использованием, например, Сельдерея или чего-то подобного.

Это простое Руководство для использования Django с Сельдереем.

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