Más contenido relacionado
La actualidad más candente (16)
Similar a マルチタスクって奥が深い #mishimapm (15)
マルチタスクって奥が深い #mishimapm
- 2. 自己紹介
• 尾形 鉄次 (OGATA Tetsuji)
• Twitter: @xtetsuji
• Blog: http://post.tetsuji.jp/
- 13. forkサンプル
#!/usr/bin/env perl!
!
use strict;!
use warnings;!
use utf8;!
!
binmode STDOUT, ':utf8';!
binmode STDERR, ':utf8';!
!
print "親です。プロセスIDは $$ です。開始します。n";!
!
my $pid = fork; # ここで親と子で分岐!
!
if ( $pid ) {!
sleep 2;!
print "親です。子のプロセスIDは $pid のようです。しばらく休みますn";!
sleep 10;!
print "親です。10秒待ちました。n";!
} elsif ( $pid == 0 ) {!
sleep 3;!
print "子です。私のプロセスIDは $$ のようです。n";!
for my $i (1..5) {!
print "子です。${i}回目。n";!
sleep 1;!
}!
print "子はしばらく待ちます。先に親が終了してプロンプトに戻りますn";!
sleep 10;!
} else {!
die "forkできなかった?n";!
}!
!
print "pid=$pid $$=$$n"; # 親も子も通る
- 15. Parallel::ForkManagerの例
#!/usr/bin/env perl!
!
use strict;!
use warnings;!
!
use LWP::UserAgent;!
use Parallel::ForkManager;!
!
my @urls = ( map { sprintf "http://example.jp/images/%02d.jpg" } (1..99) );!
!
my $ua = LWP::UserAgent->new;!
!
my $pm = Parallel::ForkManager->new(5); # 最大5プロセス並列!
!
for my $url (@urls) {!
my $pid = $pm->start and next;!
# 子プロセスの処理!
print "プロセスIDが $$ の子プロセスが $url からデータをダウンロードしますn";!
( my $filename = $url ) =~ s{.*/}{};!
$ua->get($url, ":content_file" => $filename);!
$pm->finish; # 子プロセスを終了!
}
- 28. AnyEventで時間イベント
#!/usr/bin/env perl!
!
use strict;!
use warnings;!
use AnyEvent;!
!
my $cv = AnyEvent->condvar; # 状態変数!
my $timer1 = AnyEvent->timer(!
after => 1,!
cb => sub { print "timer1 hello!n"; },!
interval => 2,!
);!
my $timer2 = AnyEvent->timer(!
after => 1,!
cb => sub { print "timer2 hello!n"; },!
interval => 3,!
);!
my $timer3 = AnyEvent->timer(!
after => 1,!
cb => sub { print "timer3 hello!n"; },!
interval => 5,!
);!
my $stop_timer = AnyEvent->timer(!
after => 10,!
cb => sub { $cv->send("end"); }, # 終わらせる!
);!
my $val = $cv->recv; # ループをまわす!
print "terminate: $valn";