use strict; use threads; use threads::shared; use Thread::Queue; use Net::Ping; use constant NUMBER_OF_THREADS => 20; use constant TIMEOUT => 4; use constant INPUT_FILE_NAME => "slist.txt"; our %results : shared; sub pingworker { my ($Qin, $timeout) = @_; my $response; while (my $server = $Qin->dequeue) { $response = Net::Ping->new()->ping($server); lock(%results); $results{$server} = $response ? "Alive" : "Timed Out"; } } my $Qwork = Thread::Queue->new; my $thread; for (1 .. NUMBER_OF_THREADS) { $thread = threads->new(\&pingworker, $Qwork, TIMEOUT); $thread->detach; } open(SLIST, INPUT_FILE_NAME) || die "Cannot open server list: $!\n"; while () { chomp; $Qwork->enqueue($_) if /[A-Za-z0-9\.\-_]+/; sleep 0.5 while $Qwork->pending > NUMBER_OF_THREADS; } close(SLIST); $Qwork->enqueue( (undef) x NUMBER_OF_THREADS); sleep 0.5 while $Qwork->pending > 0; foreach my $server (sort keys %results) { print $server . "," . $results{$server} . "\n"; }