Введение

Фреймворк для сетевого программирования, основанный на событиях.

Twisted — это фреймворк для сетевого программирования, основанный на событиях, написанный на языке Python и распространяемый по лицензии MIT. Проекты, использующие Twisted, поддерживают TCP, UDP, SSL/TLS, IP-мультикаст, Unix-сокеты, множество протоколов (включая HTTP, XMPP, NNTP, IMAP, SSH, IRC, FTP и другие), и многое другое. Twisted базируется на парадигме событийного программирования, что означает, что пользователи Twisted пишут короткие функции обратного вызова, которые вызываются самим фреймворком.

Разделение протоколов и перевозок

Twisted разработан для полного разделения между логическими протоколами (обычно использующими семантику соединения, основанную на потоках, такую как HTTP или POP3) и физическими транспортными уровнями, поддерживающими эту потоковую семантику (например, файлы, сокеты или SSL-библиотеки). Связь между логическим протоколом и транспортным уровнем устанавливается в самый последний момент — непосредственно перед передачей информации в экземпляр логического протокола. Логический протокол получает информацию об экземпляре транспортного уровня и может использовать его для отправки сообщений и проверки идентификации удаленной стороны. Следует отметить, что в коде протокола все еще возможно глубокое обращение к транспортному уровню по вопросам, связанным с передачей данных (например, проверка SSL-сертификата на стороне клиента). Естественно, такой код протокола завершится с ошибкой (вызовет исключение), если транспортный уровень не поддерживает подобную функциональность.

Отложенные

Центральным элементом модели Twisted является концепция отложенного результата (также называемого "future"). Отложенный результат – это экземпляр класса, предназначенный для получения и обработки результата, который ещё не был вычислен, например, потому что он зависит от данных от удалённого узла. Отложенные результаты можно передавать как обычные объекты, но нельзя запросить их значение напрямую. Каждый отложенный результат поддерживает цепочку обратных вызовов. Когда отложенный результат получает значение, оно передаётся функциям в цепочке обратных вызовов, причём результат каждого вызова становится входными данными для следующего. Отложенные результаты позволяют работать с результатом вызова функции до того, как его значение станет доступным. Например, если отложенный результат возвращает строку от удалённого узла, содержащую IP-адрес в десятичном формате, можно добавить обратный вызов для преобразования его в 32-битное число. Любой пользователь отложенного результата теперь может рассматривать его как отложенный результат, возвращающий 32-битное число. Это, а также возможность определения "errbacks" (обратных вызовов, используемых в качестве обработчиков ошибок), позволяет коду заранее указать, что делать при возникновении асинхронного события, не дожидаясь его завершения. В системах, не основанных на событийном подходе, например, использующих потоки, операционная система несёт преждевременные и дополнительные накладные расходы на организацию потоков каждый раз, когда выполняется блокирующий вызов.

Поддержка нитей

Twisted предоставляет абстракцию над "сырыми" потоками, используя поток как источник отложенного результата. Таким образом, отложенный объект возвращается немедленно и получит значение по завершении работы потока. К нему можно подключить обратные вызовы, которые будут выполнены в главном потоке, что избавляет от необходимости в сложных механизмах блокировки. Типичным примером такого использования, встречающимся в библиотеках поддержки Twisted, является обращение к базам данных: сам запрос к базе данных выполняется в отдельном потоке, а анализ результата – в главном потоке.

Поддержка внешней петли

Twisted может интегрироваться с внешними циклами событий, такими как GTK+, Qt и Cocoa (через PyObjC). Это позволяет использовать Twisted в качестве сетевого уровня в программах с графическим пользовательским интерфейсом (GUI), используя все его библиотеки без накладных расходов, связанных с созданием потока на каждый сокет, как это было бы при использовании стандартной библиотеки Python. Например, с помощью этой модели можно интегрировать полноценный веб-сервер непосредственно в процесс GUI-приложения.