Drkcore

02 04 2008 perl Tweet

perlのスレッドでIPアドレス逆引き

昨日の続き

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アドレスが連続してるのでキャッシュされてない且つ逆引き出来ないアドレスが続いてるとすべてのスレッドがそのアドレスを問い合わせにいってしまって遅かったりする。

どれかのスレッドが問い合わせ中のアドレスは問い合わせにいかないというような処理を入れたくなったけど、どういう風にしたらよいのかわからない。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021