Библиотека сайта rus-linux.net
Twisted
Глава 21 из книги "Архитектура приложений с открытым исходным кодом", том 2.Оригинал: Twisted
Автор: Jessica McKellar
Дата публикации: 19 Июня 2012 г.
Перевод: А. Панин
Дата перевода: 21 Июля 2013 г.
Twisted является управляемым событиями сетевым фреймворком, разработанным с использованием языка программирования Python. Он был создан в начале 2000 годов, когда в распоряжении разработчиков сетевых игр было несколько масштабируемых и не являющихся кроссплатформенными библиотек для работы с сетью, предназначенных для различных языков программирования. Авторы Twisted, пытаясь разрабатывать игры с использованием существующих программных компонентов для работы с сетью, боролись с их недостатками и, четко ощущая необходимость в масштабируемом управляемом событиями кроссплатформенном сетевом фреймворке, решили разработать такой программный компонент, извлекая уроки из ошибок и трудностей, с которыми сталкивались разработчики сетевых игр и приложений в прошлом.
Twisted поддерживает большое количество стандартных протоколов как транспортного, так и прикладного уровня, включая TCP, UDP, SSL/TLS, HTTP, IMAP, SSH, IRC и FTP. Как и в случае языка, с использованием которого он разработан, все необходимые компоненты присутствуют в его комплекте поставки изначально (такой подход в рамках языка Python называется "batteries-included"); в составе Twisted присутствуют реализации серверов и клиентов для всех поддерживаемых протоколов, а также утилиты, упрощающие процесс настройки и развертывания приложений на основе Twisted промышленного уровня с использованием командной строки.
21.1. Почему Twisted?
В 2000 году человек по прозвищу glyph, являющийся создателем фреймворка Twisted, работал над текстовой многопользовательской игрой с названием "Twisted Reality" ("Запутанная реальность"). Она была реализована с помощью нагромождения потоков, по 3 потока на каждое соединение, причем для разработки был выбран язык Java. В рамках соединения присутствовал поток ввода, блокирующийся операциями чтения, поток вывода, который должен был блокироваться определенным типом операций записи, а также поток "обработки логики", который должен был бездействовать, ожидая истечения времени таймеров или поступления событий в очередь. По мере передвижения игроков по виртуальному пространству и их взаимодействия, происходили взаимные блокировки потоков, портились данные в кэшах и логика блокировок никогда не была достаточно хорошо проработана - использование потоков делало программное обеспечение запутанным, наполненным ошибками и трудно масштабируемым.
В поисках альтернатив, он столкнулся с языком программирования Python, а именно, с модулем Python select
, предназначенным для мультиплексирования операций ввода/вывода таких объектов, работающих с потоками данных, как сокеты и программные каналы (спецификация Single UNIX Specification, Version 3 (SUSv3) описывает функцию API для вызова select
). В то время в рамках языка Java не осуществлялось раскрытие интерфейса select
операционной системы, как и любых других API для осуществления операций асинхронного ввода/вывода (пакет java.nio
для неблокирующих операций ввода/вывода был добавлен в комплект поставки J2SE 1.4, причем эта версия была выпущена в 2002 году). Начальный прототип игры, созданный с использованием языка Python и метода select
, сразу же послужил доказательством меньшей запутанности кода и большей надежности по сравнению с версией на основе потоков.
В ходе преобразования кода для использования языка Python, метода select
и парадигмы управления событиями, glyph разработал клиент и сервер игры на языке Python с использованием API select
. Но после этого ему захотелось большего. В качестве фундаментальной идеи он рассматривал возможность перевода операций взаимодействия с сетью в рамки вызовов методов объектов игры. А что, если вы сможете получать сообщения электронной почты в игре, также, как это реализовано в почтовом демоне Nethack? А если у каждого игрока будет возможность создать домашнюю страницу? Glyph понял, что ему необходимы хорошее клиенты и серверы для протоколов IMAP и HTTP, разработанные с использованием языка программирования Python и метода select
.
Изначально он использовал платформу Medusa, созданную в середине 90 годов для разработки сетевых серверов на языке Python и основанную на модуле asyncore
. Модуль asyncore
реализует механизм работы с сокетом, в рамках которого поверх API select
операционной системы создается интерфейс, состоящий из диспетчера и функции обратного вызова.
- В 2001 году, когда gliph начал работу над Twisted Reality, ее развитие практически не поддерживалось.
- Модуль
asyncore
был такой тонкой прослойкой над функциями для работы с сокетами, что разработчикам приложений все еще приходилось напрямую производить манипуляции с ними. Это означало, что о портируемости кода должен был заботиться разработчик. К тому же, в то время поддержка платформы Windows в рамках модуляasyncore
была реализована с ошибками, а glyph был уверен в том, что ему было необходимо иметь возможность запускать графический интерфейс клиента на платформе Windows.
Glyph столкнулся с перспективой самостоятельной реализации платформы для работы с сетью и решил, что игра Twisted Reality выявила проблему, решение которой было не менее интересным, чем разработка самой игры.
- Использовать парадигму управляемого событиями программирования вместо многопоточного программирования.
- Быть кроссплатформенной: предоставлять унифицированный интерфейс для систем уведомления о наступлении событий, раскрываемый во всех широко используемых операционных системах.
- Включать все компоненты в комплект поставки (реализовывать подход "batteries-included"): предоставлять реализации классов для работы с популярными протоколами прикладного уровня сразу после установки, таким образом платформа Twisted без лишних действий становится полезной для разработчиков.
- Соответствовать стандартам RFC и подтверждать это соответствие с помощью мощного набора тестов.
- Быть удобной для совместного использования множества сетевых протоколов.
- Иметь возможность расширения функций.
Продолжение статьи: Архитектура Twisted