Perl/fork
Parallel::ForkManagerを使ったフォーク技
ついでにLWPx::TimedHTTPとか使って時間とてみる。
参考リンク
CPAN (Parallel::ForkManager)
CPAN (LWPx::TimedHTTP)
perldoc.jp (Parallel::ForkManager)
Parallel::ForkManagerは使い勝手がいい。
依存モジュールも少ないし、基本置けば動くはず。自分でforkさせるよりラクチン。
LWPx::TimedHTTPは時間とるのに便利だす。
例によてサンプル。
1 |
#! /usr/bin/perl use strict; use warnings; use LWP; use LWPx::TimedHTTP qw(:autoinstall); use Parallel::ForkManager; my $pm = new Parallel::ForkManager(3000); my $url = 'http://localhost/test.pl'; foreach my $i ( 1..10 ) { $pm->start and next; my $ua = new LWP::UserAgent; my $response = $ua->get($url); print "#########\n"; print $response->header('Client-Request-Connect-Time'),"\n"; print $response->header('Client-Request-Transmit-Time'),"\n"; print $response->header('Client-Response-Server-Time'),"\n"; print $response->header('Client-Response-Receive-Time'),"\n"; print "#########\n"; $pm->finish; } $pm->wait_all_children; |
普通のフォーク技
Parallel::ForkManagerは便利だども、使えないこともありえるので、通常のfork技をば。
コマンドラインでよい場合
1 |
#!/usr/local/bin/perl if($pid=fork){ # 親プロセスをここに記載 print "prosecc start\n"; exit(0); }elsif(defined $pid){ # 子プロセスをここに記載 sleep(100); open(FH ,">>./test.log"); print FH "prosecc end\n"; close(FH); }else{ # 子プロセスの処理に失敗したとき die "error\n"; } |
CGIとかでforkさせたいとき
1 |
#!/usr/local/bin/perl # バッファリング制御 $|=1; if($pid=fork){ # 親プロセスをここに記載 print "Content-type: text/html;charset=EUC-JP\n\n"; print "process start\n"; }elsif(defined $pid){ # 子プロセスをここに記載 close(STDOUT); close(STDIN); close(STDOUT); sleep(60); open(FH ,">>./test.log"); print FH "prosecc end\n"; close(FH); }else{ # 子プロセスの処理に失敗したとき die "error\n"; } |
Last update time:2007/01/22 21:42:42