Python (Twisted) - чтение из fifo и отправка прочитанных данных по нескольким протоколам - PullRequest
4 голосов
/ 19 марта 2010

Я пытаюсь написать своего рода многопротокольный бот (jabber / irc), который будет читать сообщения из файла fifo (в основном, с одним вкладышем), а затем отправлять их на канал irc и контакты jabber. До сих пор мне удалось создать две фабрики для подключения к jabber и irc, и они, похоже, работают.

Однако у меня проблема с чтением файла fifo - я понятия не имею, как читать его в цикле (открыть файл, прочитать строку, закрыть файл, перейти к открытому файлу и т. Д.) Вне цикла реактора, чтобы получить данные, которые мне нужно отправить, а затем передать эти данные в цикл реактора для отправки по обоим протоколам. Я искал информацию о том, как сделать это наилучшим образом, но я полностью потерян в темноте. Любое предложение / помощь будет принята с благодарностью.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 19 марта 2010

Вы можете читать / писать в файловом дескрипторе, не блокируя реактор, как вы делаете с сокетами, кстати, сокеты не используют файловые дескрипторы?

В вашем случае создайте класс, который реализует twisted.internet.interfaces.IReadDescriptor и добавьте в реактор, используя twisted.internet.interfaces.IReactorFDSet.addReader. Для примера реализации IReadDescriptor посмотрите twisted.internet.tcp.Connection.

Я не могу быть более конкретным, потому что никогда не делал этого сам, но я надеюсь, что это может быть отправной точкой.

1 голос
/ 19 марта 2010

FIFO - это проблема. Читайте вместо сокета. Это намного лучше подойдет для модели Twisted, основанной на событиях. Попытка сделать что-то вне контроля реактора обычно является неправильным подходом.

---- обновление на основе обратной связи о том, что fifo является внешним ограничением, которого нельзя избежать ----

ОК, центральная проблема заключается в том, что вы не можете писать код в основном (и единственном) потоке вашего приложения Twisted, которое блокирует вызовы чтения для fifo. Это приведет к остановке всего приложения, если нечего читать. Таким образом, вы либо смотрите на чтение fifo асинхронно, либо создаете отдельный поток для его чтения, либо разбиваете приложение на две части.

Последний вариант является самым простым - измените приложение Twisted, чтобы оно слушало сокет, и напишите отдельное маленькое приложение «пересылка», которое выполняется в простом цикле, читая fifo и записывая все, что слышит, в сокет. 1007 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...