Несколько реакторов (главных контуров) в одном приложении через резьбу (или альтернативные средства) - PullRequest
19 голосов
/ 03 ноября 2010

У меня есть идея для приложения, над которым я бы хотел поработать, чтобы узнать немного больше о Twisted и WebSockets . Я думал об интеграции ранее написанного IRC Bot в веб-приложение. Насколько я понимаю, мне понадобятся три реактора, чтобы заставить его работать:

  • Первичный реактор : веб-сервер (HTTP). Это будет ваше среднее приложение twisted.web. Когда вы получаете к нему доступ, вы можете POST IRC-сервер / канал для подключения. Веб-сервер будет затем общаться с другим реактором в другом потоке, который ...
  • Вторичный реактор : IRC Bot. Это будет бот IRC, работающий по протоколу клиента Twisted IRC. Он присоединялся к каналу, и всякий раз, когда что-то было сказано, он брал эти данные и передавал их в еще один реактор, в другой поток, который ...
  • Третичный реактор : WebSocket Server (WS): поскольку WebSockets не использует обычный HTTP-протокол, им нужен собственный сервер (или, кажется, просматривая примеры, такие как this *) 1019 *. Когда IRC-бот получает сообщение, он сообщает серверу WebSocket отправить это сообщение подключенным клиентам.

По-моему, это имеет смысл. Кажется, это было бы возможно. Есть ли у кого-нибудь примеры нескольких реакторов, работающих в разных потоках, или это то, что я себе представлял, чего нельзя сделать в текущем воплощении Twisted.

Существуют ли какие-либо архитектурные изменения, которые можно (или нужно) внести, чтобы минимизировать количество реакторов и т. Д.?

Спасибо за любую помощь.

Ответы [ 2 ]

20 голосов
/ 03 ноября 2010

К счастью для вас, количество реакторов легко сократить, в частности, до 1:

В любом конкретном витом процессе вы можете иметь только один реактор в одном потоке.Если вы попытаетесь получить больше, ничего не получится.

Весь смысл реактора, на самом деле, состоит в том, чтобы облегчить объединение нескольких источников событий в один поток.Если вы хотите прослушивать 3 разных порта с 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.

5 голосов
/ 03 ноября 2010

Нет, я не думаю, что вам нужно несколько реакторов.

Вам нужно мультисервисное многопротокольное приложение.Вот где Twisted действительно сияет.

Таким образом, ваше приложение должно запустить веб-службу, службу IRC Bot и сервер WebSocket.

Использовать инфраструктуру витой службы приложений, особенно запускать мультисервис

Ознакомьтесь с реализацией бота IRC и поддержкой витого протокола IRC:

и для веб-розетки и витой

...