0

ログオンしていくつかのコマンドを実行する必要があるデバイスがたくさんあります。時間がかかり、タスクを並列化したいものがたくさんあるので、同時にいくつかを実行します。私はそれをやったが、今Net::Telnetは使わなければならないExpect.pm

私のメインスレッドでは、このように呼び出されたハッシュリファレンスで@FW配列を埋め\%hostます:

my $EXPECT =  new Expect();
$EXPECT->spawn("ssh $username\@$ip");
$host{'expect'} = $EXPECT;

push(@FW, \%host);

次に、他のいくつかの目的で使用した perlmonks からニックネームを付けたスレッド プール/キューを実行します。そのため、アプローチが機能することはわかっていますが、エラーが発生しています (以下のコードのコメントを確認してください)。

sub getWorkItems {
    my $host = pop(@FW);
    return $host ? $host : undef;
}

our $THREADS = 3;
my $Qwork    = new Thread::Queue;
my $Qresults = new Thread::Queue;

my @pool = map {
    threads->create(\&worker, $Qwork, $Qresults)
} 1 .. $THREADS;

while (my $workItem = getWorkItems()) { # ERROR HERE: Unsupported ref type: GLOB
    $Qwork->enqueue($workItem);
}
$Qwork->enqueue((undef) x $THREADS);

sub worker {
    my $tid = threads->tid;
    my ($Qwork, $Qresults) = @_;
    while (my $host = $Qwork->dequeue()) {
        backup($host->{'expect'}, $host->{'hostname'}, $host->{'ip'}, $host->{'username'}, $host->{'password'});
    }
    $Qresults->enqueue(undef); ## Signal this thread is finished
}

for (1 .. $THREADS) {
    while (my $result = $Qresults->dequeue()) {
        print "T$_  $result", "\n";
    }
}

foreach (@pool) {
    $_->join();
}

各スレッドに独自の生成された期待値を与える必要があることを CPAN で読みましたが、何が間違っているのでしょうか? backupサブがどのように始まるか、他の引数とともに同じハッシュを介してオブジェクトを渡そうとしています:

sub backup {
    my ($EXPECT, $hostname, $ip, $username, $password) = @_;

    print "$EXPECT, $hostname, $ip, $username, $password\n";

    my $auth = $EXPECT->expect(3, -re => "authenticity of host"); 

(その print ステートメントは表示されません)

繰り返しますが、この質問は、Expect の使用方法 (機能する) に関するものではなく、スレッドでの Expect の使用方法に関するものです。

4

1 に答える 1