Perl/fork's Change point

Top List Search RSS Login
+!!!Parallel::ForkManagerを使ったフォーク技
+
+ついでにLWPx::TimedHTTPとか使って時間とてみる。
+
+参考リンク
+[CPAN (Parallel::ForkManager)|http://search.cpan.org/dist/Parallel-ForkManager/]
+[CPAN (LWPx::TimedHTTP)|http://search.cpan.org/dist/LWPx-TimedHTTP/]
+[perldoc.jp (Parallel::ForkManager)|http://perldoc.jp/docs/modules/Parallel-ForkManager-0.7.5/ForkManager.pod]
+
+[Parallel::ForkManager|http://search.cpan.org/dist/Parallel-ForkManager/]は使い勝手がいい。
+依存モジュールも少ないし、基本置けば動くはず。自分でforkさせるよりラクチン。
+[LWPx::TimedHTTP|http://search.cpan.org/dist/LWPx-TimedHTTP/]は時間とるのに便利だす。
+
+例によてサンプル。
+
+{{code Perl,4,
+#! /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|http://search.cpan.org/dist/Parallel-ForkManager/]は便利だども、使えないこともありえるので、通常のfork技をば。
+
+!!コマンドラインでよい場合
+
+{{code Perl,4,
+#!/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させたいとき
+
+{{code Perl,4,
+#!/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";
+}
+}}
+
+{{category Perl,nolink}}