Perl 経由で cisco デバイスへの並列 telnet 接続を処理する最良の方法は何ですか? バックグラウンドで保持し、対話型または時間指定のバッチ方式でコマンドをフィードするには、いくつかの telnet 接続を開く必要があります。anyeventまたはPOEライブラリでこれを行うことは可能ですか?
ありがとう。
スレッドは頭痛の種です。AnyEvent などのイベント ループは、特にコマンドを時間通りに送信し、何千もの接続を処理する必要がある場合に、はるかに単純でパフォーマンスが高くなります。
接続を開き、データを読み書きする方法については、AnyEvent::Socket を参照してください: http://metacpan.org/pod/AnyEvent::Socket
すでに開いているファイルハンドルの使用をサポートするため、その上で Net::Telnet を使用することもできます: http://metacpan.org/pod/Net::Telnet#fhopen
AnyEvent で問題が発生した場合は、新しい質問をしてください。
最も簡単な方法は、踏み板を使用することです。「キュー」を使用して、コマンドを送信し、出力を前後に受信できます。
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();