javaの入門書を読んでいたら突然スレッド処理が気になりだした。そういえばどう書くにスレッド処理の問題あったな。
あった。
- ログを順次読み取り処理する部分を,データを共有しつついかに並列化するか
pythonだとthreadingとかtwisted使った解答があって参考になった。というかtwistedは興味があるけどよくわからん。今度また改めて。で、thread使ったperlの解答がなかったので少し考えてみた。初めてのthreadプログラミング。
use strict;
use warnings;
use Socket;
use threads;
use Thread::Queue;
my $DataQueue = Thread::Queue->new();
my $thr1 = threads->create(\&getaddress);
my $thr2 = threads->create(\&getaddress);
my $thr3 = threads->create(\&getaddress);
my $thr4 = threads->create(\&getaddress);
while(<DATA>){
$DataQueue->enqueue($_);
}
$DataQueue->enqueue(undef);
$DataQueue->enqueue(undef);
$DataQueue->enqueue(undef);
$DataQueue->enqueue(undef);
$thr1->join();
$thr2->join();
$thr3->join();
$thr4->join();
sub getaddress {
while(my $DataElement = $DataQueue->dequeue()){
my ($address) = gethostbyaddr(inet_aton($DataElement),AF_INET);
print "$address\n" if $address;
}
}
__DATA__
74.6.16.244
203.104.98.219
219.111.208.65
ログの順次読み取りはThread::Queueをつかってキューに突っ込みつつそれぞれのスレッドがdequeueをしながら必要なデータをとってくようにすればよさげだけど、終了のさせ方がいまいちアレ。これだとスレッド生成の数だけundefをqueueに突っ込まないと終わらないですよな。
あとキャッシュを共有化してDNSサーバの負荷を軽減させないといけない。ロックかけないといけないのかな。perlthrtutあたりをじっくり読む必要があるな。
WEB+DB PressのPerlスレッドプログラミングのところもかなり参考にした。というかこの号は色々読みどころが多くて好きだ。