Общий подход к использованию Twisted в фоновом режиме для прокси TCP сокета? - PullRequest
1 голос
/ 05 марта 2011

Я ищу некоторую общую информацию о том, как мне следует подходить к проблеме, для которой, мне кажется, Twisted отлично подходит. (Я новичок в Twisted, но не в Python)

У меня есть контроллер домашней автоматизации, который может поддерживать одно соединение через сокет TCP, отправляя и получая двоичные данные. Я хотел бы использовать XMPP в качестве моста к сокету, чтобы пользователь мог отправлять команды и получать события.

Я получил элементарное сокетное соединение, работающее с Twisted, которое могло отправлять и получать команды из одного из примеров в книге О'Рейли. У меня также есть полностью рабочий бот Python XMPP, написанный с библиотекой SleekXMPP, который меня устраивает. Я просто не знаю, как их соединить.

Основной сценарий:

  1. Пользователь отправляет сообщение боту XMPP, в котором выясняется, какую команду отправить в сокет
  2. Команда ASCII Socket преобразуется в двоичный файл и отправляется в сокет
  3. Сокет получает команду и отправляет двоичный ответ
  4. Двоичный ответ, преобразованный в ASCII
  5. Бот XMPP отправляет ответ пользователю.
  6. Сетевые события (независимо от действий пользователя) также могут быть получены сетевым сокетом и должны быть отправлены пользователю

Это # 6, который представляет проблему, в противном случае я бы просто открывал / закрывал сокет по требованию, когда нужно что-то написать.

Часть, с которой у меня возникают проблемы, когда я закручиваю свою голову с помощью Twisted, - лучший способ заставить эти два цикла событий взаимодействовать. Я видел много информации об использовании очередей, отложенных, потоков, выбора и т. Д. У меня такое ощущение, что Twisted может справиться со многими сложностями, если я только научусь правильно использовать инструмент.

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

Кстати, я очень рад поделиться своим кодом, как только он заработает, чтобы кто-то другой мог получить помощь, о которой я прошу.

- Скотт

1 Ответ

1 голос
/ 07 марта 2011

Одна из проблем с неблокирующим механизмом ввода-вывода состоит в том, что он в значительной степени все или ничего.Как только вы вводите код блокировки, вы можете быстро потерять большинство преимуществ асинхронного подхода, управляемого событиями.Везде, где это возможно (как правило), лучше, чтобы все приложение работало на одном и том же реакторе.

На мой взгляд, у вас есть два варианта:

  1. Twisted isне потокобезопасен.Тем не менее, вы можете использовать механизмы, такие как deferToThread и callFromThread для взаимодействия с другими потоками.Это, безусловно, самый запутанный и излишне сложный подход для разработки вашего приложения.Это особенно больно, если вы новичок в twisted.
  2. Используйте twisted.words.protocols.jabber и реализуйте ваши XMPP-компоненты неблокирующим образом с помощью витого реактора.Таким образом, он будет счастливо существовать вместе со всем другим вашим извращенным кодом.и позволяют вам чисто взаимодействовать между протоколами.Это приведет к меньшему количеству кода и надежной реализации, которую легко расширять, поддерживать и тестировать.
...