2013-06-24 245 views
1

通过Perl处理与思科设备的并行telnet连接的最佳方式是什么? 我需要打开几个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 ::插座如何打开连接并读取&写入数据: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':)' –

相关问题