Как поведение python async ведет себя с api запросами?

Я изучаю Python/Django и все идет хорошо, но мне очень интересно, как django обрабатывает любые асинхронные задачи, например, если есть запрос к базе данных, который занял 10 секунд на выполнение, и в течение этих 10 секунд на сервер приходит другой запрос?

def my_api(id):
    do_somthing()
    user = User.objects.get(id=id) # took 10 sec to execute
    do_somthing_with_user()

Я использовал метод queryset, который извлекал что-то из базы данных и, допустим, это заняло 10 секунд. что произойдет, когда на сервер django придет другой запрос, как django ответит на него? будет ли запрос ожидать ответа на первый запрос или он будет обрабатываться параллельно? какова глубокая концепция для этого?

Как Python обрабатывает подобные вещи под капотом?

Обработка запросов - это основная работа веб-сервера, который вы используете. Пользователи Django по умолчанию используют WSGI/ASGI.

Все запросы, поступающие на эти веб-серверы, имеют уникальную сессию, и это отдельный поток. Таким образом, конфликтов нет, но есть условия гонки. (Ресурсы ОС, очередь, стек...)

Итак, рассмотрим, что у нас есть функция, внутри которой есть 2 секунды сна.

import time

def function1():
  time.sleep(2)



Пользователь 1 и пользователь 2 запрашивают эту функцию через API. (например, GET test/API)

для каждого начинаются два потока, и если оба почти начинаются в момент времени 0:0:0, то оба заканчиваются как 0:0:2.

Как насчет Async? Асинхронные запросы работают параллельно для каждого запроса. (Не параллельно) Предположим, что другой API должен вызвать эту "спящую" функцию дважды (например, Get test/API2). Первый вызов займет 2 секунды (Async функция и await) и второй вызов тоже 2 секунды. Если бы мы вызвали эту функцию в 0:0:0, это было бы похоже на 0:0:2. В синхронном режиме это было бы 0:0:4.

Наконец, как насчет базы данных? Есть много способов справиться с этим, и популярный из них - использование пула баз данных. Однако, как правило, каждый запрос создает новое соединение (многопоточное) с базой данных и выполняет его. Пул баз данных - это вещь, которая сокращает время выполнения, потому что у него есть несколько готовых к использованию соединений с базой данных, и всякий раз, когда у него есть задание, он идет и выполняет запрос и возвращается туда, где без этого пула время жизни соединения превышает время использования и заканчивается всякий раз, когда задание выполнено.

Вернуться на верх