Perl/fork

Top Diff List Search RSS Login
Page :: Perl / fork

Parallel::ForkManagerを使ったフォーク技

ついでにLWPx::TimedHTTPとか使って時間とてみる。

参考リンク
CPAN (Parallel::ForkManager)
CPAN (LWPx::TimedHTTP)
perldoc.jp (Parallel::ForkManager)

Parallel::ForkManagerは使い勝手がいい。
依存モジュールも少ないし、基本置けば動くはず。自分でforkさせるよりラクチン。
LWPx::TimedHTTPは時間とるのに便利だす。

例によてサンプル。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#! /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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/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