1

Perl 経由で cisco デバイスへの並列 telnet 接続を処理する最良の方法は何ですか? バックグラウンドで保持し、対話型または時間指定のバッチ方式でコマンドをフィードするには、いくつかの telnet 接続を開く必要があります。anyeventまたはPOEライブラリでこれを行うことは可能ですか?

ありがとう。

4

2 に答える 2

1

スレッドは頭痛の種です。AnyEvent などのイベント ループは、特にコマンドを時間通りに送信し、何千もの接続を処理する必要がある場合に、はるかに単純でパフォーマンスが高くなります。

接続を開き、データを読み書きする方法については、AnyEvent::Socket を参照してください: http://metacpan.org/pod/AnyEvent::Socket

すでに開いているファイルハンドルの使用をサポートするため、その上で Net::Telnet を使用することもできます: http://metacpan.org/pod/Net::Telnet#fhopen

AnyEvent で問題が発生した場合は、新しい質問をしてください。

于 2013-06-24T17:26:30.733 に答える
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();
于 2013-06-24T14:45:16.973 に答える