处理并行telnet连接的最佳方式是什么?
通过Perl处理与思科设备的并行telnet连接的最佳方式是什么? 我需要打开几个telnet连接以保持后台并以交互式或定时批量方式输入命令 。这有可能通过anyevent或POE库来实现吗?处理并行telnet连接的最佳方式是什么?
谢谢。
最简单的方法是使用胎面。您可以使用“队列”来发送命令并来回接收输出。
您可以简单地创建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();
线程是一个令人头疼的问题。事件循环(比如AnyEvent)更加简单和性能更高,特别是如果您希望以定时方式提交命令并需要处理数千个连接。
见AnyEvent ::插座如何打开连接并读取&写入数据:http://metacpan.org/pod/AnyEvent::Socket
你也可以在它上面使用Net :: Telnet,如下使用已经打开的文件句柄支持:http://metacpan.org/pod/Net::Telnet#fhopen
如果您遇到AnyEvent问题,请提出一个新问题。
如何重新连接anyevent?主要程序在回调执行IO时应该做什么? –
如果tcp_connect失败,您可以决定如何处理:重试或仅记录错误。主循环在连接正在工作时等待,但不需要明确地执行某些操作。 – MrTorture
有麻烦=> http://stackoverflow.com/q/24185046/223226':)' –
10至20.000个tcp连接。 – ovntatar