Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Twisted из первых рук

Событийное и асинхронное программирование на Python
Покупка
Артикул: 748321.01.99
Доступ онлайн
999 ₽
В корзину
Эта книга посвящена Twisted - событийно-ориентированному сетевому фреймворку на Python, в котором можно создавать уникальные проекты. В первой части рассматриваются особенности Twisted; на практических примерах показано, как его архитектура способствует тестированию, решает общие проблемы надежности, отладки и упрощает выявление причинно-следственных связей, присущих событийно-ориентированному программированию. Детально описываются приемы асинхронного программирования, подчеркивается важность отложенного вызова функций и сопрограмм. На примере использования двух популярных приложений, treq и klein, демонстрируются сложности, возникающие при реализации веб-API с Twisted, и способы их преодоления. Вторая часть книги посвящена конкретным проектам, использующим Twisted. В число примеров входят использование Twisted с Docker, применение Twisted в роли контейнера WSGI, организация обмена файлами и многое другое. Читатель должен иметь некоторый опыт работы с Python и понимать основы контейнеров и протоколов. Знакомство с Twisted и с проектами, описанными в книге, не требуется.
Twisted из первых рук : практическое пособие / М. Задка, М. Уильямс, К. Бенфилд [и др.] ; пер. с англ. А. Н. Киселева. - Москва : ДМК Пресс, 2020. - 338 с. - ISBN 978-5-97060-795-4. - Текст : электронный. - URL: https://znanium.com/catalog/product/1210635 (дата обращения: 27.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Моше Задка
Марк Уильямс
Джулиан Берман 
Том Мост

www.дмк.рф

из первых рук
из первых рук

Интернет-магазин:
www.dmkpress.com

Оптовая продажа:
КТК “Галактика”
books@alians-kniga.ru

TWISTED из первых рук

TWISTED из первых рук

9 785970 607954

ISBN 978-5-97060-795-4

TWISTED

Twisted – событийно-ориентированный сетевой фреймворк на языке 
Python. Данная книга написана ведущими специалистами по Twisted, 
которые продемонстрируют, в чем состоит уникальность этого фреймворка, и ознакомят вас с проектами, в которые они лично внесли свой 
вклад.
На практических примерах иллюстрируется, как архитектура Twisted 
способствует тестированию, решает общие проблемы надежности, 
отладки и упрощает выявление причинно-следственных связей. Описываются приемы асинхронного программирования и подчеркивается 
важность отложенного вызова функций и сопрограмм. 

Темы, рассматриваемые в книге:
• способы интеграции Twisted и asyncio с применением адаптеров;
• автоматизация процессов сборки, тестирования и выпуска     
программного обеспечения с Buildbot;
• создание клиентов и серверов с использованием Autobahn;
• передача файлов с помощью Magic Wormhole;
• организация распределенного облачного хранилища файлов      
с Tahoe LAFS;
• тонкости реализации и использования HTTP/2 в Python и Twisted;
• поддержка асинхронных задач с использованием 
DjangoChannels.

Для изучения представленного материала требуется некоторый опыт 
программирования на Python и понимание основ работы контейнеров 
и протоколов.
Событийное и асинхронное 
Событийное и асинхронное 
программирование на Python
программирование на Python

Моше Задка, Марк Уильямс, Кори Бенфилд, Брайан Уорнер,  
Дастин Митчелл, Кевин Сэмюэл, Пьер Тарди 

Twisted из первых рук

Moshe Zadka
Mark Williams
Cory Benfield
Brian Warner
Dustin Mitchell
Kevin Samuel
Pierre Tardy

Expert Twisted

Event-Driven and Asynchronous  
Programming with Python

Моше Задка 
Марк Уильямс
Кори Бенфилд 
Брайан Уорнер 
Дастин Митчелл 
Кевин Сэмюэл 
Пьер Тарди 

Москва, 2020

Twisted из первых рук

Событийное и асинхронное 
программирование на Python

УДК 004.438
ББК 32.973.22
З15

Задка М., Уильямс М., Бенфилд К., Уорнер Б.,  
Митчелл Д., Сэмюэл К., Тарди П.
З15 
Twisted из первых рук / пер. с анг. А. Н. Киселева. – М.: ДМК Пресс, 2020. – 
338 с.: ил. 

ISBN 978-5-97060-795-4

Эта книга посвящена Twisted – событийно-ориентированному сетевому фреймворку 
на Python, в котором можно создавать уникальные проекты. В первой части рассматриваются особенности Twisted; на практических примерах показано, как его архитектура 
способствует тестированию, решает общие проблемы надежности, отладки и упрощает 
выявление причинно-следственных связей, присущих событийно-ориентированному 
программированию. Детально описываются приемы асинхронного программирования, 
подчеркивается важность отложенного вызова функций и сопрограмм. На примере использования двух популярных приложений, treq и klein, демонстрируются сложности, 
возникающие при реализации веб-API с Twisted, и способы их преодоления.
Вторая часть книги посвящена конкретным проектам, использующим Twisted. 
В число примеров входят использование Twisted с Docker, применение Twisted в роли 
контейнера WSGI, организация обмена файлами и многое другое.
Читатель должен иметь некоторый опыт работы с Python и понимать основы контейнеров и протоколов. Знакомство с Twisted и с проектами, описанными в книге, не 
требуется.

УДК 004.438
ББК 32.973.22

Authorized Russian translation of the English edition of Expert Twisted ISBN 978-1-48423741-0 © 2019 Moshe Zadka, Mark Williams, Cory Benfield, Brian Warner, Dustin Mitchell, Kevin 
Samuel, Pierre Tardy.
This translation is published and sold by permission of Packt Publishing, which owns or 
controls all rights to publish and sell the same.

Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения 
владельцев авторских прав.

ISBN 978-1-4842-3741-0 (анг.) 
©  2019 Moshe Zadka, Mark Williams, Cory Benfield,  
Brian Warner, Dustin Mitchell, Kevin Samuel, Pierre Tardy
ISBN 978-5-97060-795-4 (рус.) 
© Оформление, издание, перевод, ДМК Пресс, 2020

Посвящается AZ, NZ и TS: Twisted добился признания,  
и мы с нетерпением ждем следующего поколения  
разработчиков.

– Моше Задка (Moshe Zadka)

Содержание

Об авторах ..........................................................................................................12

Благодарности ...................................................................................................14

Введение .............................................................................................................15

От издательства .................................................................................................16

Часть I. ОСНОВЫ ..............................................................................................17

Глава 1. Введение в событийно-ориентированное  
программирование с помощью Twisted .....................................................18

Примечание о версиях Python .............................................................................19
Событийно-ориентированное программирование – что это?..........................19
Многократные события ........................................................................................20
Мультиплексирование и демультиплексирование ............................................22
Мультиплексор select............................................................................................23
История, аналоги и назначение ......................................................................23
Сокеты и select ..................................................................................................24
События сокета – как, что и почему ................................................................25
Обработка событий ..........................................................................................26
Цикл обработки событий с select ....................................................................27
Управляемые событиями клиенты и серверы ................................................29
Неблокирующий ввод/вывод ...............................................................................31
Знаем, когда нужно остановиться ...................................................................31
Отслеживание состояния .................................................................................32
Наличие информации о состоянии усложняет программы ..........................35
Управление сложностью с помощью транспортов и протоколов .....................36
Реакторы: работа с транспортом .....................................................................37
Транспорты: работа с протоколами ....................................................................37
Игра в пинг-понг с протоколами и транспортами .........................................38
Клиенты и серверы со своими реализациями протоколов и транспортов ....42
Реакторы Twisted и протоколы с транспортами ............................................43
Преимущества событийно-ориентированного программирования ................44
Twisted и реальный мир .......................................................................................46
События и время ...................................................................................................50
Повторение событий с LoopingCall .................................................................53
Интерфейсы событий в zope.interface .................................................................55

Содержание  7

Управление потоком в событийно-ориентированных программах ................57
Управление потоком в Twisted с помощью производителей  
и потребителей .....................................................................................................58
Активные производители ................................................................................59
Потребители ......................................................................................................61
Пассивные производители ..............................................................................64
Итоги .....................................................................................................................64

Глава 2. Введение в асинхронное программирование с Twisted .........66
Обработчики событий и их композиция ............................................................66
Что такое асинхронное программирование? .....................................................69
Заполнители для будущих значений ...................................................................70
Асинхронная обработка исключений .................................................................72
Введение в Twisted Deferred .................................................................................76
Обычные обработчики .....................................................................................76
Ошибки и их обработчики ...............................................................................77
Композиция экземпляров Deferred .................................................................80
Генераторы и inlineCallbacks ...............................................................................83
yield ....................................................................................................................83
send ....................................................................................................................84
throw ..................................................................................................................86
Асинхронное программирование с inlineCallbacks .......................................87
Сопрограммы в Python .........................................................................................89
Сопрограммы с выражением yield from ..........................................................90
Сопрограммы async и await .............................................................................91
Ожидание завершения экземпляров Deferred ....................................................96
Преобразование сопрограмм в Deferred с помощью ensureDeferred ................97
Мультиплексирование объектов Deferred ...........................................................98
Тестирование объектов Deferred .......................................................................102
Итоги ...................................................................................................................105

Глава 3. Создание приложений с библиотеками treq и Klein ..............107
Насколько важную роль играют эти библиотеки? ............................................107
Агрегирование каналов ......................................................................................108
Введение в treq ....................................................................................................109
Введение в Klein ..................................................................................................112
Klein и Deferred ...............................................................................................113
Механизм шаблонов Plating в Klein ..............................................................115
Первая версия агрегатора каналов ....................................................................117
Разработка через тестирование с использованием Klein и treq ......................123
Выполнение тестов на устанавливаемом проекте .......................................123
Тестирование Klein с помощью StubTreq ......................................................126
Тестирование treq с помощью Klein ..............................................................133

 Содержание

Журналирование с использованием twisted.logger......................................136
Запуск приложений Twisted с помощью twist ..............................................141
Итоги ...................................................................................................................144

Часть II. ПРОЕКТЫ .........................................................................................146

Глава 4. Twisted в Docker ...............................................................................147

Введение в Docker ...............................................................................................147
Контейнеры .....................................................................................................147
Образы контейнеров ......................................................................................148
runc и containerd .............................................................................................149
Клиент .............................................................................................................149
Реестр ..............................................................................................................150
Сборка .............................................................................................................150
Многоступенчатая сборка ..............................................................................151
Python в Docker ...................................................................................................153
Варианты развертывания ..............................................................................153
В виртуальном окружении .............................................................................157
В формате Pex .................................................................................................159
Варианты сборки ............................................................................................160
Один большой образ .......................................................................................160
Копирование пакетов wheel между этапами ................................................161
Копирование окружения между этапами .....................................................161
Копирование файлов Pex между этапами .....................................................161
Автоматизация с использованием Dockerpy ................................................161
Twisted в Docker ..................................................................................................162
ENTRYPOINT и PID 1 .......................................................................................162
Пользовательские плагины ............................................................................162
NColony ............................................................................................................162
Итоги ...................................................................................................................165

Глава 5. Использование Twisted в роли сервера WSGI .........................166

Введение в WSGI .................................................................................................166
PEP ...................................................................................................................167
Простой пример ..............................................................................................168
Базовая реализация ........................................................................................170
Пример WebOb ................................................................................................172
Пример Pyramid ..............................................................................................173
Начало .................................................................................................................174
Сервер WSGI ....................................................................................................174
Поиск кода .......................................................................................................177
Путь по умолчанию ........................................................................................177
PYTHONPATH ..................................................................................................177

Содержание  9

setup.py ............................................................................................................177
Почему Twisted? ..............................................................................................178
Промышленная эксплуатация и разработка ................................................178
TLS ...................................................................................................................179
Индикация имени сервера .............................................................................180
Статические файлы ........................................................................................182
Модель ресурсов .............................................................................................182
Чисто статические ресурсы ............................................................................183
Комбинирование статических файлов с WSGI .............................................185
Встроенное планирование задач ...................................................................186
Каналы управления ........................................................................................189
Стратегии параллельного выполнения .............................................................191
Балансировка нагрузки ..................................................................................191
Открытие сокета в режиме совместного использования ............................192
Другие варианты ............................................................................................195
Динамическая конфигурация ............................................................................195
Приложение Pyramid с поддержкой A/B-тестирования ...............................195
Плагин для поддержки AMP ..........................................................................197
Управляющая программа ..............................................................................200
Итоги ...................................................................................................................201

Глава 6. Tahoe-LAFS: децентрализованная файловая  
система ...............................................................................................................202

Как работает Tahoe-LAFS ...................................................................................203
Архитектура системы .........................................................................................206
Как система Tahoe-LAFS использует Twisted ....................................................208
Часто встречающиеся проблемы .......................................................................208
Инструменты поддержки выполнения в режиме демона ...........................209
Внутренние интерфейсы FileNode ....................................................................210
Интеграция интерфейсных протоколов ...........................................................211
Веб-интерфейс ....................................................................................................212
Типы файлов, Content-Type, /named/ ............................................................214
Сохранение на диск ........................................................................................215
Заголовки Range..............................................................................................215
Преобразование ошибок на возвращающей стороне ..................................216
Отображение элементов пользовательского интерфейса:  
шаблоны Nevow ..............................................................................................217
Интерфейс FTP ....................................................................................................218
Интерфейс SFTP ..................................................................................................223
Обратная несовместимость Twisted API ...........................................................223
Итоги ...................................................................................................................226
Ссылки .................................................................................................................226

 Содержание

Глава 7. Magic Wormhole ................................................................................227
Как это выглядит.................................................................................................228
Как это работает .................................................................................................229
Сетевые протоколы, задержки передачи, совместимость клиентов ..............231
Сетевые протоколы и совместимость клиентов...........................................231
Архитектура сервера ..........................................................................................234
База данных ....................................................................................................235
Транзитный клиент: отменяемые отложенные операции ..............................235
Сервер транзитной ретрансляции .....................................................................238
Архитектура клиента ..........................................................................................239
Отложенные вычисления и конечные автоматы, одноразовый  
наблюдатель ........................................................................................................240
Одноразовые наблюдатели ................................................................................243
Promise/Future и Deferred ...................................................................................244
Отсроченные вызовы, синхронное тестирование ...........................................247
Асинхронное тестирование с объектами Deferred ...........................................248
Синхронное тестирование с объектами Deferred .............................................249
Синхронное тестирование и отсроченный вызов ........................................252
Итоги ...................................................................................................................254
Ссылки .................................................................................................................254

Глава 8. Передача данных в браузерах и микросервисах  
с использованием WebSocket ......................................................................255
Нужен ли протокол WebSocket?  ........................................................................255
WebSocket и Twisted ............................................................................................256
WebSocket, из Python в Python ...........................................................................258
WebSocket, из Python в JavaScript ......................................................................261
Более мощная поддержка WebSocket в WAMP ..................................................263
Итоги ...................................................................................................................269

Глава 9. Создание приложений с asyncio и Twisted ...............................271
Основные понятия .............................................................................................271
Механизм обещаний ..........................................................................................272
Циклы событий ...............................................................................................273
Рекомендации .....................................................................................................274
Пример: прокси с aiohttp и treq .........................................................................277
Итоги ...................................................................................................................280

Глава 10. Buildbot и Twisted .........................................................................282
История появления Buildbot ..............................................................................282
Эволюция асинхронного выполнения кода на Python в Buildbot ...............283
Миграция синхронных API ............................................................................286
Этапы асинхронной сборки ...........................................................................287

Содержание  11

Код Buildbot .........................................................................................................287
Асинхронные утилиты ...................................................................................288
«Дребезг» .........................................................................................................288
Асинхронные службы .....................................................................................288
Кеш LRU ...........................................................................................................291
Отложенный вызов функций .........................................................................291
Взаимодействие с синхронным кодом .........................................................292
SQLAlchemy .....................................................................................................292
requests ............................................................................................................293
Docker ..............................................................................................................295
Конкурентный доступ к общим ресурсам ....................................................296
yield как барьер конкуренции ........................................................................296
Функции из пула потоков не должны изменять общее состояние .............297
Блокировки Deferred.......................................................................................298
Тестирование ..................................................................................................298
Имитации ............................................................................................................300
Итоги ...................................................................................................................300

Глава 11. Twisted и HTTP/2 ...........................................................................301
Введение ..............................................................................................................301
Цели и задачи......................................................................................................303
Бесшовная интеграция ...................................................................................303
Оптимизация поведения по умолчанию ......................................................304
Разделение задач и повторное использование кода ...................................305
Проблемы реализации .......................................................................................306
Что такое соединение? Ценность стандартных интерфейсов .....................306
Мультиплексирование и приоритеты ...........................................................309
Противодавление ...........................................................................................315
Противодавление в Twisted ...........................................................................317
Противодавление в HTTP/2............................................................................319
Текущее положение дел и возможность расширения в будущем ...................321
Итоги ...................................................................................................................322

Глава 12. Twisted и Django Channels ..........................................................323
Введение ..............................................................................................................323
Основные компоненты Channels ......................................................................325
Брокеры сообщений и очереди..........................................................................325
Распределенные многоуровневые системы в Twisted .....................................327
Текущее положение дел и возможность расширения в будущем ...................328
Итоги ...................................................................................................................329

Предметный указатель ..................................................................................330

Об авторах

Марк Уильямс (Mark Williams) работает в Twisted. В eBay и PayPal Марк Уильямс работал над высокопроизводительными веб-службами Python (более миллиарда запросов в день!), над обеспечением безопасности приложений и информации, а также переносом корпоративных Python-библиотек на Python.
Кори Бенфилд (Cory Benfield) – разработчик Python с открытым исходным кодом, активно участвует в сообществе Python HTTP. Входит в число основных 
разработчиков проектов Requests и urllib3 и является ведущим сопровождающим проекта Hyper – коллекции инструментов поддержки HTTP и HTTP/2 
для Python, а также помогает в разработке Python Cryptographic Authority для 
PyOpenSSL.
Брайан Уорнер (Brian Warner) – инженер по безопасности и разработчик 
программного обеспечения, работавший в Mozilla на Firefox Sync, Add-On 
SDK и Persona. Один из основателей проекта Tahoe-LAFS – распределенной 
и защищенной файловой системы, разрабатывает средства безопасного хранения и связи.
Моше Задка (Moshe Zadka) с 1995 года является участником сообщества открытого исходного кода, свой первый вклад в Python внес в 1998 году, один из 
основателей открытого проекта Twisted. Любит рассказывать о Twisted и Python и выступать на конференциях. Регулярно ведет блоги.
Дастин Митчелл (Dustin Mitchell) внес свой вклад в Buildbot. Является членом 
команды TaskCluster в Mozilla. Также работает в командах Release Engineering, 
Release Operations и Infrastructure.
Кевин Сэмюэл (Kevin Samuel) начал заниматься разработкой и преподаванием еще во времена, когда появилась версия Python 2.4. Работал в Восточной Европе, Северной Америке, Азии и Западной Африке. Тесно сотрудничает 
с командой Crossbar.io и является активным членом французского сообщества 
Python.

О технических рецензентах

Пьер Тарди (Pierre Tardy) – специалист по непрерывной интеграции в Renault 
Software Labs, в настоящее время является ведущим коммитером в Buildbot.

Джулиан Берман (Julian Berman) – разработчик программного 
обеспечения с открытым исходным кодом из Нью-Йорка. Автор 
библиотеки jsonschema для Python, периодически вносит вклад 
в экосистему Twisted, активный участник сообщества Python.
Шон Шоджи (Shawn Shojaie) живет в районе Калифорнийского 
залива, где работает инженером-программистом. Работал в Intel, 
NetApp. Сейчас работает в SimpleLegal, где создает веб-прило жения для юридических фирм. В будние дни занимается разработкой с использованием Django и PostgreSQL, а в выходные вносит вклад в проекты с открытым 
исходным кодом, такие как django-pylint, и время от времени пишет технические статьи. Больше можно узнать на сайте shawnshojaie.com.
Том Мост (Tom Most) – Twisted-коммитер с десятилетним опытом разработки 
веб-служб, клиентских библиотек и приложений командной строки с использованием Twisted. Инженер-программист в телекоммуникационной отрасли. 
Сопровождает Afkak, клиента Twisted Kafka. Его адрес в интернете – freecog.net, 
а связаться можно по адресу twm@freecog.net.

Благодарности

Благодарю свою жену Дженнифер Задка (Jennifer Zadka), без чьей поддержки 
я бы не справился.
Благодарю своих родителей Якова и Пнине Задка (Yaacov and Pnina Zadka), которые хорошо меня учили.
Благодарю своего советника Яэля Каршону (Yael Karshon) за то, что он научил 
меня писать.
Благодарю Махмуда Хашеми (Mahmoud Hashemi) за вдохновение и поддержку.
Благодарю Марка Уильямса (Mark Williams) за то, что всегда был рядом со мной.
Благодарю Глифа Лефковица (Glyph Lefkowitz), который познакомил меня с Python, учил программировать и вообще быть хорошим человеком.
– Моше Задка (Moshe Zadka)

Благодарю Махмуда Хашеми (Mahmoud Hashemi) и Давида Карапетяна (David 
Karapetyan) за их отзывы. Благодарю Энни (Annie) за то, что была терпелива, 
пока я писал.
– Марк Уильямс (Mark Williams)

Введение

Twisted недавно отпраздновал свой шестнадцатый день рождения. За время 
своего существования он превратился в мощную библиотеку. За этот период 
на основе Twisted было создано несколько интересных приложений и многие 
из нас узнали много нового о том, как правильно использовать Twisted, как 
думать о сетевом коде и как создавать программы, основанные на событиях.
После ознакомления с вводными материалами, которые есть на сайте Twisted, часто можно услышать: «И что делать дальше? Как я могу узнать больше 
о Twisted?» На этот вопрос мы обычно отвечали встречным вопросом: «А что 
вы хотите сделать с Twisted?» В этой книге мы покажем некоторые интересные 
приемы использования Twisted.
Авторы данной книги использовали Twisted для разных целей и усвоили 
разные уроки. Мы рады представить все эти уроки, чтобы сообщество их знало 
и могло воспользоваться.
Вперед!

Доступ онлайн
999 ₽
В корзину