2010/02/17(水)[perl] forkで子供がたくさん
子プロセスを作って並列処理
表題のとおり。自動計測系の構築などで、監視する側と実行する側とに分離したいとき、forkを使うのが易いようです。
Windowsなら、Active Perlのperlforkを見ると、いろいろと例が載っています。
TrackBack先のMagic Voxで見かけたので、記事を書いてみます。
自分で確認した記録でもありますが...なお、Windows7 Ultimatex64 + Active Perl v5.10.0で試しました.
コーディング例
use POSIX ":sys_wait_h"; $| = 1; my ($pid, $n) ; $n = 4 ; do { $pid = fork ; if (!defined $pid) { die "fork fairule...\n" ; } elsif ($pid==0) { # child print "I'm a child $n/pid=$pid \n"; sleep 10 - $n ; exit $n ; } else { print "create process $pid\n"; } --$n; } while ($n>0) ; my $killid ; sleep 1; do { # $killid = wait(); $killid = waitpid(-1, WNOHANG); print "child $killid is dead and said $?\n" unless $killid==0; } while ($killid!=-1) ; print "Terminate test PGM.\n" ; exit ;
親としては、子が消えるまで待ったり、よそからの要求で殺したりするわけですね。とりあえずは、forkで分岐するところをテンプレート的にお試ししました、というだけで。
実行例
>perl tst_fork01.pl create process -4900 I'm a child 4/pid=0 create process -888 I'm a child 3/pid=0 create process -2364 I'm a child 2/pid=0 create process -2004 I'm a child 1/pid=0 child -4900 is dead and said 1024 child -888 is dead and said 768 child -2364 is dead and said 512 child -2004 is dead and said 256 child -1 is dead and said -1 Terminate test PGM.
ただし、Perl で複数個のワーカープロセスを動かして処理を行う場合のコードとして例が挙がっているように、まじめにやる場合はこちらを参照したほうがよさそうです。SIGトラップして云々・・・。まだまだ勉強不足のようで('A`
2010/02/09(火)[Perl] 快適デバッグ環境
Perl環境
Active Stateから、Active Perlを拾ってきてインストール。
後のEclipseでデバッグする際に必要となるので、PadWalkerを拾ってくる。コマンドラインからppmでインスコできるので便利ね。
実行例:
C:\>ppm install PadWalker Downloading PadWalker-1.9...done Unpacking PadWalker-1.9...done Generating HTML for PadWalker-1.9...done Updating files in site area...done 6 files installed
Eclipse
本体
Eclipse.orgから、パッケージを拾ってくる。現在GALILEOが新しい模様。いろんなぱケージがあるけれど、java開発しないならCDTでも十分。足りなくなったらパッケージを入れていけばいいでしょう。*1
インストーラが嫌いな人はzip版がいい感じ。eclipseディレクトリを作って、その下に展開して言ってくれるので、どこかのルートにでも展開するといいでしょう。
プラグイン
Eclipseのメジャーなプラグインは、多くはUpdate Siteを持っているようで、Eclipse側でUpdate siteを登録して拾ってこさせることができます。また、更新チェックもしてくれるので便利です。基本的にサイト側で親切に書かれているので、そちらを参照ください・・・。ここではポインタを示すだけで、あまり細かいところまでは記載しないようにしておきます。*2
EPIC
EPICのサイトから、Perl開発用のプラグインを拾ってくる。参考サイトの@ITが詳しいので、ここでの説明は省略する。余力があれば自前でSnapShotをとっておくかネ。
BABEL
Babel Projectのページにインストール方法が記載されています。やっぱり日本語のほうがサクサクと判断が進みます。
Babel projectの方々に感謝を。
参考
2010/02/04(木)[Perl] 変数の型を調べる
変数の型を調べたい
ref演算子が使える模様。リファレンスならその型を返してくれる模様。リファレンスじゃなかったらnullぽ...
blessされているときは、クラス名が返ってくるらすぃ。い万ところ使わないから参考程度にメモ。
ソース
use strict ; my $test ; my $ref_1 = [1, 2] ; my $ref_2 = \$test ; my $ref_3 = $ref_1 ; my $ref_4 = {1 =>'t'} ; my %hash_1 = {1 =>'t', [2,3]} ; &chk_type($test) ; &chk_type($ref_1) ; &chk_type($ref_2) ; &chk_type($ref_3) ; &chk_type($ref_4) ; &chk_type(%hash_1) ; &chk_type(\%hash_1) ; exit ; sub chk_type($) { my $v = shift @_ ; my $a = ref $v; print "$a へのリファレンス\n" if ($a) ; print "scaler\n" unless ($a) ; }
実行結果
scaler ARRAY へのリファレンス SCALAR へのリファレンス ARRAY へのリファレンス HASH へのリファレンス scaler HASH へのリファレンス
配列やハッシュの要素として、任意の型をガンガン放り込めるので、それを調べて処理したいという欲求があったのですよ...
Cで書くなら、voidポインタをキャストして使っていたかなぁ。
C++やC#なら実行時型とか使って、同じような処理ができると思う。が、まぁ、今回はPerlだけ。ワンタイムの使い捨てになりかねないので..(^^;