Несколько реакторов (основных контуров) в одном приложении через резьбу (или альтернативные средства)
У меня есть идея для приложения, над которым я хотел бы поработать, чтобы немного узнать о Twisted и WebSockets. Я думал об интеграции ранее написанного IRC Bot в веб-приложение. Насколько я могу судить, мне понадобится три реактора, чтобы они работали:
- Первичный реактор: веб-сервер (HTTP). Это будет ваше среднее приложение twisted.web. Когда вы получаете доступ к нему, вы можете подключить IRC-сервер/канал к соединению. Затем веб-сервер будет разговаривать с другим реактором в другом потоке, который...
- Вторичный реактор: IRC Bot. Это будет IRC-бот, работающий через протокол Twisted IRC-клиента. Он присоединился бы к каналу, и всякий раз, когда что-то было сказано, он взял бы эти данные и подтолкнул их к еще одному реактору на еще одном потоке, который...
- Третичный реактор: WebSocket Server (WS): поскольку WebSockets не используют обычный HTTP-протокол, им нужен свой собственный сервер (или, похоже, он смотрит на такие примеры, как this. Когда бот IRC получает сообщение, он сообщает серверу WebSocket подключить это сообщение к подключенным клиентам.
В моем сознании это имеет смысл. Кажется, это было бы возможно. Есть ли у кого-нибудь примеры нескольких реакторов, работающих в отдельных потоках, или это то, что я себе представлял, чего нельзя сделать в текущем воплощении Twisted.
Существуют ли какие-либо изменения архитектуры, которые могут (или должны) быть сделаны, чтобы минимизировать количество реакторов и т.д.?
Спасибо за любую помощь.
Ответы
Ответ 1
К счастью для вас, легко уменьшить количество реакторов, в частности, до 1:
В любом процессе Twisted вы можете использовать только один реактор в одной нити. Если вы попытаетесь получить больше, ничего не будет работать.
Весь смысл реактора состоит в том, чтобы облегчить объединение нескольких источников событий в один поток. Если вы хотите прослушивать 3 разных порта с тремя различными протоколами, ваше приложение может выглядеть так:
from twisted.internet import reactor
reactor.listenTCP(4321, FirstProtocolFactory())
reactor.listenTCP(5432, SecondProtocolFactory())
reactor.listenTCP(6543, ThirdProtocolFactory())
reactor.run()
Конечно, вы фактически не можете напрямую называть listenTCP
самостоятельно, поскольку вы, вероятно, захотите использовать объекты Service
из twisted.application.internet
, если вы используете twistd
, либо через файл .tac
, либо twistd
плагин. И вам не нужно будет вызывать reactor.run()
самостоятельно, если twistd
делает это за вас. Я хочу сказать, что с помощью любых средств вы загружаете реактор со всеми событиями, которые вы ожидаете от него, чтобы реагировать на: слушающие серверы, клиентские соединения, синхронизированные события - и он будет реагировать на каждый из них по мере его возникновения. (Следовательно, "реактор".)
Для конкретных значений того, что FirstProtocolFactory
, SecondProtocolFactory
и ThirdProtocolFactory
должно быть, см. ссылки в ответе pyfunc.
Ответ 2
Нет, я не думаю, что вам нужно несколько реакторов.
Что вам нужно, это многопрограммное многопротокольное приложение. Именно здесь вишни действительно сияет.
Таким образом, ваше приложение должно запустить веб-службу, службу IRC Bot и сервер WebSocket.
Использовать скрученную инфраструктуру сервисов приложений, специально запуская мультисервисную службу
Проверьте реализацию ботов IRC и поддержку скрученного протокола IRC:
и для websocket и скрученных