2013-06-24 2 views
1

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

Спасибо.

+0

10 до 20.000 соединений tcp. – ovntatar

ответ

0

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

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

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

http://metacpan.org/pod/Thread::Queue

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

#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(); 
1

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

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

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

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

+0

как подключиться к anyevent? что должна делать основная программа, когда обратные вызовы выполняют IO? –

+1

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

+0

Есть проблемы => http://stackoverflow.com/q/24185046/223226 ':)' –