Продолжим...
Задача 2. Анализ скорости работы API
Дополните класс-клиент API методами для работы с новыми endpoints.
Исследуйте, насколько быстрее работает код с использованием сессии и обычных методов post/get для 10, 100, 1 000 запросов.
Если вы выполните это задание сразу, то не заметите значительной разницы. Дело в том, что сервер, который обрабатывает запрос, убивает соединение сразу после того, как отправит его клиенту. Вы можете убедиться в этом, включив уровень DEBUG в корневом логгере:
Чтобы исправить поведение сервера, внесите дополнительную настройку перед app.run():
Проведите восемь испытаний для каждого количества запросов:с использованием (+O) и без использования (–O) дополнительной настройки;
с использованием (+S) и без использования (–S) сессии;
с использованием (+T) и без использования (–T) параллельных запросов с помощью многопоточности (например, ThreadPool).
Занесите время работы в каждом испытании в таблицу. Её шаблон размещён в файле REPORT.md в папке с заданием.
Поехали! Потому как в описании работы у меня всегда возникают вопросы (ибо описание всегда далеко от точного понимания), я буду расписывать "по-полной программе" некоторые очевидные вещи.
Для начала я скопировал директорию app из предыдущей работы.
Ну теперь можно попробовать запустить сначала файл routes.py и только после этого clients.py. Стоп, у нас тут ошибка - 'author' тут укзано как строковая переменная, и в лекциях она была тоже строковая. Но мы же всё это дело изменили и теперь 'author' это foreign key на author_id, то есть это целое число... Можно указать любое целое число и оно запишется в БД, ведь там нет проверки на то "существует ли автор с этим id или нет". Но я всё же предпочитаю писать правду, поэтому выведу список авторов, которые есть в базе данных и только после этого изменю скрипт, куда запишу тот author_id который точно существует.
Да и 'title', я думаю не правильно оставлять в виде '123', пусть будет это каким нибудь произведением А.С.Пушкина...
Запускаем и смотрим:
Посмотрим после этого список книг:
Но если попытаться запустить снова скрипт clients.py, с теми же самыми данными, в частности с тем же самым названием книги, то будет ошибка. Сработает валидатор имени книги.
Ну да ладно. Собственно было проверено что все работает в данных скриптах и можно приступать к выполнению домашней работы, адаптируя скрипты под условия задачи.
Дополните класс-клиент API методами для работы с новыми endpoints:
Я так понял, эти методы нужны будут для сравнения.... Методы связанные с /api/books:
Методы связанные с /api/books:
Теперь нам предстоит выполнить несколько (10, 100 и 1000) запросов в различных режимах. Первым делом я выполню GET запрос на получение списка авторов книг через метод класса AuthorClient. В условиях было - включить и выключить настройку: WSGIRequestHandler.protocol_version = "HTTP/1.1" и сделать замеры скорости выполнения запросов. Так как запросы получаются однотипными, я ради этого организовал декоратор, который будет измерять скорость работы функций.
Запускаем clients.py, и спустя некоторое время, у нас такой вот вывод:
Выключил WSGIRequestHandler.protocol_version = "HTTP/1.1", закомментировав эту строчку в файле routers.py и снова запустил clients.py:
Немного меняем код и запускаем с отключенной WSGIRequestHandler.protocol_version = "HTTP/1.1"
Теперь включаем и повторяем запросы снова.
Теперь дело за ThreadPool
Теперь включим использование сессии...
Ну и последний опыт, выключим доп. настройку WSGIRequestHandler.protocol_version = "HTTP/1.1"
По итогу получилась вот такая табличка:
Собственно, основная часть этого задания сделана (нужно заполнить таблицу). Сам же код - далёк от идеала. Но это работает. Конечный вариант кода, как было сказано в задании упаковал в класс, хотя не понимаю зачем, можно было оставить в функциях.
Ну и из всего этого получается вот такой вывод:
Запускаем код дважды со строкой WSGIRequestHandler.protocol_version = "HTTP/1.1" и без в файле routers.py. Получившиеся данные заносим в таблицу.
Код не факт что верный, когда куратор примет, отпишусь в комментах.