2011-07-01
並列でHTTPリクエストを実行する / Mojolicious リファレンス
このサンプルは間違っています。どこか勘違いしています。
Mojoliciousというフレームワークには、非同期で並列でHTTPリクエストを実行することのできるMojo::UserAgentというモジュールがあります。Mojo::UserAgentを使うと並列処理を比較的簡単に書くことができます。
use strict; use warnings; use Mojo::UserAgent; # URL my @urls = ('http://www.google.co.jp', 'http://www.yahoo.co.jp'); # Paralell HTTP Request my $ua = Mojo::UserAgent->new(max_redirects => 5); my $finished = 0; foreach my $url (@urls) { # Register GET request callback $ua->get($url => sub { my $tx = pop; print "##### $url #####\n" . $tx->res->body . "\n"; # Count up $finished++; # Stop IO loop if all requiests is finished Mojo::IOLoop->stop if $finished eq @urls; }); } # Parallel count Mojo::IOLoop->max_connections(5); # Start IO loop Mojo::IOLoop->start;
並列処理というのは普段行っているプログラミングから頭を少し切り替える必要があります。普段行っているプログラミングは、順番に処理を書いていくというやりかたです。並列処理のプログラミングでは次のように考えます。
- HTTPリクエストを実行して返ってきたときに実行する処理(コールバック)を登録する
- 並列処理を開始する
- ある条件になれば並列処理を停止する
上記のソースコードは上記のような記述になっていることがわかります。コールバックでは、取得したWebページの内容を表示し、すべてのリクエストを投げ終えたときに、並列処理を停止するというコードを書いています。ソースコードの一番最後ではMojo::IOLoopクラスのstartメソッドを使って並列処理を開始しています。また並列処理の同時実行数はMojo::IOLoopクラスのmax_connectionsメソッドで指定することができます。
トラックバック - http://d.hatena.ne.jp/perlcodesample/20110701/1312267537