Как использовать Asyncio с Django Rest Api Framework так, как JQuery обещает работать так, чтобы ответы не нужно было ждать

Я на Python 3.7 с запущенным Django 2.2.3. Мне нужно решение с помощью asyncio, чтобы API мог просто вызывать функцию async и возвращать ответ, не дожидаясь, пока мы сделаем что-то с обещаниями 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) 

Всего 2 ответа


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

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

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


Я придумал asyncio сочетании с asyncio . Это работает так, как я хотел. Если у кого-то есть что-то лучше. Пожалуйста, предложите!

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

def loop_in_thread(loop):
    asyncio.set_event_loop(loop)
    loop.run_until_complete(my_coro(1))

class SaveSnaps(APIView):
    def post(self, request, format = None):
        if request.user.is_anonymous:
            return Response({"response":"FORBIDDEN"}, status = 403)
        else:
            try:
                loop = asyncio.new_event_loop();
                t = threading.Thread(target=loop_in_thread, args=(loop,))
                t.start()
                return Response({"response": "success"}, status = 200)
            except Exception as e:
                return Response({'response':str(e)}, status = 400) 

Есть идеи?

10000