Из данной книги вы узнаете, как работает библиотека asyncio, как написать первое реальное приложение и как использовать функции веб-API для для повышения производительности, пропускной способности и отзывчивости приложений на языке Python. Рассматривается широкий круг вопросов: от модели однопоточной конкурентности до многопроцессорной обработки.
Издание будет полезно не только Python-разработчикам, но и всем программистам, которые хотят лучше понимать общие проблемы конкурентности.
Author(s): Мэттью Фаулер
Edition: 1
Publisher: ДМК Пресс
Year: 2022
Language: Russian
Commentary: Publisher's PDF
Pages: 398
City: М.
Tags: Web Programming; Python; Web Applications; Concurrency; Asynchronous Programming; Relational Databases; PostgreSQL; Stream Processing; Microservices; MapReduce; Generators; Coroutines; asyncio; Queues; Multitasking
Оглавление
Предисловие
Благодарности
Об этой книге
Об авторе
Об иллюстрации на обложке
Глава 1. Первое знакомство с asyncio
1.1 Что такое asyncio?
1.2 Что такое ограниченность производительностью ввода-вывода и ограниченность быстродействием процессора
1.3 Конкурентность, параллелизм и многозадачность
1.3.1 Конкурентность
1.3.2 Параллелизм
1.3.3 Различие между конкурентностью и параллелизмом
1.3.4 Что такое многозадачность
1.3.5 Преимущества кооперативной многозадачности
1.4 Процессы, потоки, многопоточность и многопроцессность
1.4.1 Процесс
1.4.2 Поток
1.5 Глобальная блокировка интерпретатора
1.5.1 Освобождается ли когда-нибудь GIL?
1.5.2 Аsyncio и GIL
1.6 Как работает однопоточная конкурентность
1.6.1 Что такое сокет?
1.7 Как работает цикл событий
Резюме
Глава 2. Основы asyncio
2.1 Знакомство с сопрограммами
2.1.1 Создание сопрограмм с помощью ключевого слова async
2.1.2 Приостановка выполнения с помощью ключевого слова await
2.2 Моделирование длительных операций с помощью sleep
2.3 Конкурентное выполнение с помощью задач
2.3.1 Основы создания задач
2.3.2 Конкурентное выполнение нескольких задач
2.4 Снятие задач и задание тайм-аутов
2.4.1 Снятие задач
2.4.2 Задание тайм-аута и снятие с помощью wait_for
2.5 Задачи, сопрограммы, будущие объекты и объекты, допускающие ожидание
2.5.1 Введение в будущие объекты
2.5.2 Связь между будущими объектами, задачами и сопрограммами
2.6 Измерение времени выполнения сопрограммы с помощью декораторов
2.7 Ловушки сопрограмм и задач
2.7.1 Выполнение счетного кода
2.7.2 Выполнение блокирующих API
2.8 Ручное управление циклом событий
2.8.1 Создание цикла событий вручную
2.8.2 Получение доступа к циклу событий
2.9 Отладочный режим
2.9.1 Использование asyncio.run
2.9.2 Использование аргументов командной строки
2.9.3 Использование переменных окружения
Резюме
Глава 3. Первое приложение asyncio
3.1 Работа с блокирующими сокетами
3.2 Подключение к серверу с помощью telnet
3.2.1 Чтение данных из сокета и запись данных в сокет
3.2.2 Разрешение нескольких подключений и опасности блокирования
3.3 Работа с неблокирующими сокетами
3.4 Использование модуля selectors для построения цикла событий сокетов
3.5 Эхо-сервер средствами цикла событий asyncio
3.5.1 Сопрограммы цикла событий для сокетов
3.5.2 Проектирование асинхронного эхо-сервера
3.5.3 Обработка ошибок в задачах
3.6 Корректная остановка
3.6.1 Прослушивание сигналов
3.6.2 Ожидание завершения начатых задач
Резюме
Глава 4. Конкурентные веб-запросы
4.1 Введение в aiohttp
4.2 Асинхронные контекстные менеджеры
4.2.1 Отправка веб-запроса с помощью aiohttp
4.2.2 Задание тайм-аутов в aiohttp
4.3 И снова о конкурентном выполнении задач
4.4 Конкурентное выполнение запросов с помощью gather
4.4.1 Обработка исключений при использовании gather
4.5 Обработка результатов по мере поступления
4.5.1 Тайм-ауты в сочетании с as_completed
4.6 Точный контроль с помощью wait
4.6.1 Ожидание завершения всех задач
4.6.2 Наблюдение за исключениями
4.6.3 Обработка результатов по мере завершения
4.6.4 Обработка тайм-аутов
4.6.5 Зачем оборачивать сопрограммы задачами?
Резюме
Глава 5. Неблокирующие драйверы баз данных
5.1 Введение в asyncpg
5.2 Подключение к базе данных Postgres
5.3 Определение схемы базы данных
5.4 Выполнение запросов с помощью asyncpg
5.5 Конкурентное выполнение запросов с помощью пулов подключений
5.5.1 Вставка случайных SKU в базу данных о товарах
5.5.2 Создание пула подключений для конкурентного выполнения запросов
5.6 Управление транзакциями в asyncpg
5.6.1 Вложенные транзакции
5.6.2 Ручное управление транзакциями
5.7 Асинхронные генераторы и потоковая обработка результирующих наборов
5.7.1 Введение в асинхронные генераторы
5.7.2 Использование асинхронных генераторов и потокового курсора
Резюме
Глава 6. Счетные задачи
6.1 Введение в библиотеку multiprocessing
6.2 Использование пулов процессов
6.2.1 Асинхронное получение результатов
6.3 Использование исполнителей пула процессов в сочетании с asyncio
6.3.1 Введение в исполнители пула процессов
6.3.2 Исполнители пула процессов в сочетании с циклом событий
6.4 Решение задачи с помощью MapReduce и asyncio
6.4.1 Простой пример MapReduce
6.4.2 Набор данных Google Books Ngram
6.4.3 Применение asyncio для отображения и редукции
6.5 Разделяемые данные и блокировки
6.5.1 Разделение данных и состояние гонки
6.5.2 Синхронизация с помощью блокировок
6.5.3 Разделение данных в пулах процессов
6.6 Несколько процессов и несколько циклов событий
Резюме
Глава 7. Решение проблем блокирования с помощью потоков
7.1 Введение в модуль threading
7.2 Совместное использование потоков и asyncio
7.2.1 Введение в библиотеку requests
7.2.2 Знакомство с исполнителями пула потоков
7.2.3 Исполнители пула потоков и asyncio
7.2.4 Исполнители по умолчанию
7.3 Блокировки, разделяемые данные и взаимоблокировки
7.3.1 Реентерабельные блокировки
7.3.2 Взаимоблокировки
7.4 Циклы событий в отдельных потоках
7.4.1 Введение в Tkinter
7.4.2 Построение отзывчивого UI с помощью asyncio и потоков
7.5 Использование потоков для выполнения счетных задач
7.5.1 hashlib и многопоточность
7.5.2 Многопоточность и NumPy
Резюме
Глава 8. Потоки данных
8.1 Введение в потоки данных
8.2 Транспортные механизмы и протоколы
8.3 Потоковые читатели и писатели
8.4 Неблокирующий ввод данных из командной строки
8.4.1 Режим терминала без обработки и сопрограмма read
8.5 Создание серверов
8.6 Создание чат-сервера и его клиента
Резюме
Глава 9. Веб-приложения
9.1 Разработка REST API с помощью aiohttp
9.1.1 Что такое REST?
9.1.2 Основы разработки серверов на базе aiohttp
9.1.3 Подключение к базе данных и получение результатов
9.1.4 Сравнение aiohttp и Flask
9.2 Асинхронный интерфейс серверного шлюза
9.2.1 Сравнение ASGI и WSGI
9.3 Реализация ASGI в Starlette
9.3.1 Оконечная REST-точка в Starlette
9.3.2 WebSockets и Starlette
9.4 Асинхронные представления Django
9.4.1 Выполнение блокирующих работ в асинхронном представлении
9.4.2 Использование асинхронного кода в синхронных представлениях
Резюме
Глава 10. Микросервисы
10.1 Зачем нужны микросервисы?
10.1.1 Сложность кода
10.1.2 Масштабируемость
10.1.3 Независимость от команды и технологического стека
10.1.4 Чем может помочь asyncio?
10.2 Введение в паттерн backend-for-frontend
10.3 Реализация API списка товаров
10.3.1 Сервис избранного
10.3.2 Реализация базовых сервисов
10.3.3 Реализация сервиса backend-for-frontend
10.3.4 Повтор неудачных запросов
10.3.5 Паттерн Прерыватель
Резюме
Глава 11. Синхронизация
11.1 Природа ошибок в модели однопоточной конкурентности
11.2 Блокировки
11.3 Ограничение уровня конкурентности с помощью семафоров
11.3.1 Ограниченные семафоры
11.4 Уведомление задач с помощью событий
11.5 Условия
Резюме
Глава 12. Асинхронные очереди
12.1 Основы асинхронных очередей
12.1.1 Очереди в веб-приложениях
12.1.2 Очередь в веб-роботе
12.2 Очереди с приоритетами
12.3 LIFO-очереди
Резюме
Глава 13. Управление подпроцессами
13.1 Создание подпроцесса
13.1.1 Управление стандартным выводом
13.1.2 Конкурентное выполнение подпроцессов
13.2 Взаимодействие с подпроцессами
Резюме
Глава 14. Продвинутое использование asyncio
14.1 API, допускающие сопрограммы и функции
14.2 Контекстные переменные
14.3 Принудительный запуск итерации цикла событий
14.4 Использование других реализаций цикла событий
14.5 Создание собственного цикла событий
14.5.1 Сопрограммы и генераторы
14.5.2 Использовать сопрограммы на основе генераторов не рекомендуется
14.5.3 Нестандартные объекты, допускающие ожидание
14.5.4 Сокеты и будущие объекты
14.5.5 Реализация задачи
14.5.6 Реализация цикла событий
14.5.7 Реализация сервера с использованием своего цикла событий
Резюме
Предметный указатель