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.web | HTTP-сервер и клиент | HTTP/1.1, WebSocket |
twisted.words | Мессенджеры и чаты | IRC, XMPP, MSN |
twisted.mail | Электронная почта | SMTP, POP3, IMAP |
twisted.conch | SSH и SFTP | SSHv2, SFTP |
twisted.names | DNS | DNS-клиент и сервер |
twisted.enterprise | Базы данных | MySQL, PostgreSQL (через DB-API) |
twisted.spread | Удалённые вызовы | PB (Perspective Broker) |
twisted.news | NNTP (группы новостей) | 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 →