昨日の続き
use strict;
use warnings;
use Socket;
use threads;
use threads::shared;
use Thread::Queue;
my $thread_num =10;
my %cache : shared;
my $DataQueue = Thread::Queue->new();
for (0..$thread_num){threads->create(\&getaddress);}
while(<DATA>){
chomp;
$DataQueue->enqueue($_);
}
for (0..$thread_num){$DataQueue->enqueue(undef);}
$_->join for threads->list;
sub getaddress {
while(my $DataElement = $DataQueue->dequeue()){
my $address;
if ( $cache{$DataElement}){
print "[cache] ",$cache{$DataElement},"\n";
}
else {
($address) = gethostbyaddr(inet_aton($DataElement),AF_INET);
if ($address){
print "$address\n";
{
lock %cache;
$cache{$DataElement} = $address;
}
}
else {
{
lock %cache;
$cache{$DataElement} = $DataElement;
}
print $DataElement, "\n";
}
}
}
}
__DATA__
222.228.235.193
157.113.18.68
これで結構オッケーなんだけど、アクセスログだとIPアドレスが連続してるのでキャッシュされてない且つ逆引き出来ないアドレスが続いてるとすべてのスレッドがそのアドレスを問い合わせにいってしまって遅かったりする。
どれかのスレッドが問い合わせ中のアドレスは問い合わせにいかないというような処理を入れたくなったけど、どういう風にしたらよいのかわからない。