Управление несколькими клиентскими соединениями Twisted

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

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


person Tom    schedule 02.09.2009    source источник


Ответы (3)


Лучший вариант — просто сделать очевидную вещь здесь. Не используйте цикл или повторяющийся вызов по времени; просто есть обработчики, которые делают правильные вещи.

Держите под рукой центральный объект управления соединениями и заставьте методы обработки событий передавать ему информацию, необходимую для продолжения работы. Когда он запустится, сделайте 5 исходящих подключений. Следите за тем, сколько из них находятся в процессе, поддерживайте список с ними в нем. Когда соединение установлено успешно (в connectionMade), обновите список, чтобы запомнить новое состояние соединения. Когда соединение завершится (в connectionLost), сообщите менеджеру соединений; его ответ должен состоять в том, чтобы удалить это соединение и установить новое соединение в другом месте. В середине должно быть довольно очевидно, как запустить запрос на нужные вам имена и запихнуть их в базу данных (ожидая завершения вставки базы данных, прежде чем разорвать ваше IRC-соединение, скорее всего, дождавшись Deferred вернулся из adbapi).

person Glyph    schedule 11.09.2009

Поскольку каждому из ваших клиентов необходимо обновить базу данных, я инстинктивно думаю, что лучше использовать connection pool -- см. здесь для получения дополнительной информации (рекомендуется весь документ для некоторых важных шаблонов проектирования, которые часто возникают при использовании Twisted).

person Alex Martelli    schedule 02.09.2009

Я не знаю, вынуждены ли вы использовать Twisted, иначе вы можете попробовать Gevent.

person Sylvain    schedule 22.03.2011