Как лучше всего обрабатывать параллельные соединения telnet?

Каков наилучший способ обработки параллельных подключений telnet к устройствам cisco через Perl. Мне нужно открыть несколько соединений telnet, чтобы оставаться в фоновом режиме и передавать команды в интерактивном или синхронизированном пакетном режиме. Возможно ли это сделать с помощью библиотек anyevent или POE?

Спасибо.


person ovntatar    schedule 24.06.2013    source источник
comment
От 10 до 20 000 TCP-соединений.   -  person ovntatar    schedule 24.06.2013


Ответы (2)


Треды - это головная боль. Цикл событий, такой как AnyEvent, намного проще и эффективнее, особенно если вы хотите отправлять команды в заданное время и должны обрабатывать тысячи подключений.

См. AnyEvent::Socket о том, как открыть соединение и прочитать и записать данные: http://metacpan.org/pod/AnyEvent%3a%3aSocket

Вы также можете использовать Net::Telnet поверх него, поскольку он поддерживает использование уже открытого дескриптора файла: http://metacpan.org/pod/Net%3a%3aTelnet#fhopen

Если у вас возникнут проблемы с AnyEvent, просто задайте новый вопрос.

person MrTorture    schedule 24.06.2013
comment
как переподключиться к любому событию? что должна делать основная программа, пока обратные вызовы выполняют ввод-вывод? - person mpapec; 24.06.2013
comment
Вы можете решить, что делать в случае сбоя tcp_connect: либо повторить попытку, либо просто зарегистрировать ошибку. Основной цикл ожидает, пока работают соединения, но нет необходимости что-то явно делать. - person MrTorture; 25.06.2013

Самый простой способ – использовать протекторы. Вы можете использовать «очереди» для отправки команд и получения результатов туда и обратно.

Вы можете просто создать x количество потоков, затем поставить в очередь множество команд и отправить их.

Если вам нужно обработать вывод, это немного сложнее.

http://metacpan.org/pod/Thread%3a%3aQueue

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

#without processing the output
use strict;
use warnings;

use threads;
use Thread::Queue;

my $q = Thread::Queue->new();    # A new empty queue
my $maxThreads = 20;
# Create Worker threads
for (1..$maxThreads){
  my $thr = threads->create(
    sub {
        # Thread will loop until no more work
        while (defined(my $cmd = $q->dequeue())) {
            do_someting($cmd);
        }
    }
  );
}

# Send work to the threads
$q->enqueue($cmd1, ...);
# Signal that there is no more work to be sent
$q->end();
# Join up with the thread when it finishes
$thr->join();
person user1126070    schedule 24.06.2013