Несколько реакторов (основных контуров) в одном приложении через резьбу (или альтернативные средства)

У меня есть идея для приложения, над которым я хотел бы поработать, чтобы немного узнать о 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 и скрученных