Открыть сервис

Twisted

Twisted — это свободная кроссплатформенная сетевая библиотека для языка программирования Python, реализующая асинхронную модель обработки событий (event-driven architecture). Twisted предоставляет разработчикам инфраструктуру для создания сетевых приложений, включая серверы и клиенты для множества протоколов (TCP, UDP, HTTP, SSH, IRC, DNS и других), а также инструменты для работы с потоками данных, очередями сообщений и тестированием сетевого кода. Библиотека отличается высокой модульностью и поддержкой реакторного шаблона проектирования (Reactor pattern), что позволяет обрабатывать тысячи одновременных соединений без использования многопоточности.

История

Разработка Twisted началась в 2001 году программистом Глином Глином (Glyph Lefkowitz). Первоначально проект создавался как часть коммерческой системы для многопользовательских онлайн-игр, но вскоре был опубликован под открытой лицензией MIT. В 2002 году вышла первая стабильная версия (1.0), которая включала базовую поддержку TCP и UDP.

Ключевые вехи развития:

  • 2003 год — добавлена поддержка HTTP и FTP, начата работа над протоколом SSH.
  • 2005 годвыпуск версии 2.0, введена концепция «реакторов» (reactors) для разных платформ (select, poll, epoll, kqueue).
  • 2008 год — реализована поддержка IPv6 и SSL/TLS.
  • 2012 год — версия 12.0, значительное улучшение документации и тестовой инфраструктуры.
  • 2018 год — выпуск версии 18.7, добавлена поддержка Python 3.6 и выше, начат постепенный отказ от Python 2.
  • 2023 год — последняя стабильная версия 23.10.0, полностью совместимая с Python 3.11 и 3.12.

На протяжении всей истории Twisted остаётся одним из старейших активно поддерживаемых проектов в экосистеме Python. Разработка ведётся сообществом через систему рецензирования кода (code review) на платформе GitHub.

Архитектура и принципы работы

Реакторный шаблон

Основой Twisted является реактор (reactor) — центральный объект, управляющий циклом обработки событий. Реактор ожидает поступления событий (например, установка соединения, получение данных, таймер) и диспетчеризует их соответствующим обработчикам. В зависимости от операционной системы и требований производительности используются разные реализации реактора:

  • selectreactor — базовая реализация на системном вызове select(), поддерживается на всех платформах.
  • pollreactor — использует poll(), более эффективен на Linux.
  • epollreactor — основан на epoll (Linux), масштабируется до десятков тысяч соединений.
  • kqueuereactor — для macOS и FreeBSD, использует kqueue.
  • iocpreactor — для Windows, использует порты завершения ввода-вывода (IOCP).

Протоколы и фабрики

Twisted разделяет логику сетевого взаимодействия на два уровня:

  • Протокол (Protocol) — класс, обрабатывающий данные, полученные по соединению. Определяет методы connectionMade(), dataReceived(), connectionLost().
  • Фабрика (Factory) — класс, создающий экземпляры протокола для каждого нового соединения. Может хранить общее состояние (например, пул клиентов).

Пример минимального эхо-сервера:

```python from twisted.internet import reactor, protocol

class EchoProtocol(protocol.Protocol): def dataReceived(self, data): self.transport.write(data)

class EchoFactory(protocol.Factory): def buildProtocol(self, addr): return EchoProtocol()

reactor.listenTCP(1234, EchoFactory()) reactor.run() ```

Deferred-объекты

Для управления асинхронными операциями Twisted использует объекты Deferred, представляющие результат, который будет получен в будущем. Deferred поддерживает цепочки обратных вызовов (callbacks) и обработчиков ошибок (errbacks), что позволяет писать асинхронный код без глубокой вложенности. Механизм напоминает Promises в JavaScript или Future в других языках.

Классификация компонентов

Twisted состоит из нескольких десятков подмодулей, объединённых в тематические группы:

ПодмодульНазначениеПримеры протоколов
twisted.webHTTP-сервер и клиентHTTP/1.1, WebSocket
twisted.wordsМессенджеры и чатыIRC, XMPP, MSN
twisted.mailЭлектронная почтаSMTP, POP3, IMAP
twisted.conchSSH и SFTPSSHv2, SFTP
twisted.namesDNSDNS-клиент и сервер
twisted.enterpriseБазы данныхMySQL, PostgreSQL (через DB-API)
twisted.spreadУдалённые вызовыPB (Perspective Broker)
twisted.newsNNTP (группы новостей)NNTP

Применение

Серверное программное обеспечение

Twisted широко используется для создания высоконагруженных сетевых серверов. Известные проекты, построенные на её основе:

  • Buildbot — система непрерывной интеграции.
  • Tahoe-LAFS — децентрализованная файловая система с шифрованием.
  • Twisted Matrix — оригинальный сервер для игр и чатов, давший название библиотеке.

Веб-фреймворки

Некоторые веб-фреймворки Python используют Twisted в качестве базового сервера:

  • Twisted Web — встроенный HTTP-сервер, поддерживающий виртуальные хосты, сессии и шаблонизацию.
  • Cyclone — веб-фреймворк, совместимый с Tornado, работающий на Twisted.
  • Klein — микрофреймворк для создания REST API на Twisted.

Научные и промышленные системы

Благодаря асинхронной модели Twisted применяется в системах реального времени:

  • DAQ (Data Acquisition)сбор данных с датчиков и приборов.
  • Telemetry — обработка телеметрии от спутников и беспилотников.
  • Trading systems — низкоуровневые торговые роботы, работающие по протоколам FIX/FAST.

Сравнение с альтернативами

В экосистеме Python существуют другие асинхронные библиотеки, каждая из которых имеет свои особенности:

БиблиотекаМодельОсновное применениеСтатус
TwistedРеактор + DeferredСетевые серверы, протоколыАктивно поддерживается
asyncioЦикл событий + корутиныСтандартная библиотека Python 3Встроена в Python
TornadoЦикл событий + callbackВеб-серверы, WebSocketПоддержка ограничена
GeventЗелёные потоки (greenlets)Высоконагруженные приложенияАктивно поддерживается

Twisted отличается от asyncio более богатым набором встроенных протоколов и большей историей. Однако asyncio является частью стандартной библиотеки и имеет более современный синтаксис на основе async/await. Начиная с версии 19.0, Twisted поддерживает интеграцию с asyncio через twisted.internet.asyncioreactor.

Критика и ограничения

  • Сложность обучения — реакторная модель и концепция Deferred требуют времени для освоения разработчиками, привыкшими к синхронному коду.
  • Документация — несмотря на улучшения, документация Twisted считается менее структурированной по сравнению с asyncio или Tornado.
  • Совместимость с Python 2 — длительный переход на Python 3 (до 2018 года) привёл к фрагментации экосистемы.
  • Производительность — в некоторых сценариях (например, простой HTTP-сервер) Twisted уступает по скорости asyncio или uvloop из-за накладных расходов на абстракции.

Интересные факты

  • Название «Twisted» происходит от «Twisted Matrix» — вымышленной вселенной, в которой разворачивалась игра, для которой создавалась библиотека.
  • Twisted является одним из немногих проектов, который поддерживает протокол SSHv2 на чистом Python (без привязки к OpenSSL).
  • В 2010 году Twisted был выбран в качестве основы для реализации протокола HTTP/2 в Python (проект hyper-h2).
  • Библиотека используется в NASA для обработки телеметрии с Международной космической станции.

Источники

  • Официальная документация Twisted (twistedmatrix.com)
  • Lefkowitz, G. «Twisted: An Event-Driven Networking Engine for Python» (2005)
  • GitHub-репозиторий проекта (twisted/twisted)
  • «Python Network Programming Cookbook» — P. K. Yegulalp (2015)
  • Статья «A Survey of Asynchronous Programming in Python» — Journal of Open Source Software (2020)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →