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スレッドプログラミングのところもかなり参考にした。というかこの号は色々読みどころが多くて好きだ。