Asyncio и конкурентное программирование на Python

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Из данной книги вы узнаете, как работает библиотека 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 Реализация сервера с использованием своего цикла событий
Резюме
Предметный указатель