Node.js - Perl AnyEvent Coro
-
Upload
takesako -
Category
Technology
-
view
2.696 -
download
5
Transcript of Node.js - Perl AnyEvent Coro
Perl : AnyEnvet と Coro の復習
サイボウズ・ラボ/ Shibuya.pm
竹迫 良範 @TAKESAKO
通常の Perl プログラミング(同期)
I/O でブロック待ちが発生
use LWP::UserAgent;
$ua = LWP::UserAgent->new;$req = HTTP::Request->new( GET => "http://ll.jus.or.jp/2011/" );$res = $ua->request($req); # リクエスト完了まで待つ
http://ma.la/files/yapcasia2009/
AnyEvent::HTTP::http_get (非同期)
#1 のリクエストが完了しないうちに#2, #3 のリクエストも実行されるuse AnyEvent::HTTP;
sub done { print $_[0]; return $cv->done;}http_get("http://ll.jus.or.jp",\&done); # 1http_get("http://example.com/",\&done); # 2http_get("http://example.jp/", \&done); # 3 http://ma.la/files/yapcasia2009/
AnyEvent::HTTP::http_get (実際の使い方)use AnyEvent::HTTP;my $cv = AnyEvent->condvar;sub done { print $_[1]->{server}, "\n"; $cv->end;}my @url = ("http://ll.jus.or.jp/2011/",..);$cv->begin; http_get($url[0], \&done); # 1$cv->begin; http_get($url[1], \&done); # 2$cv->begin; http_get($url[2], \&done); # 3$cv->recv;
Coro を使うとどうなるか?
use Coro;# use Coro::LWP; use LWP::UserAgent;
async { print "Hello, world!¥n"; };
my $ua = LWP::UserAgent->new; my $res = $ua->get("http://ll.jus.or.jp/2011/"); print $res->title, "¥n";
cede;http://d.hatena.ne.jp/hiratara/20090921/1253537746
Coro::LWP の動作
Coro は継続の実装 + 既存関数の置き換えブロックしそうなコードなのにブロックしないブロックしそうな箇所で他の Coro に処理を譲る
LWP で使用する IO::SocketCoro::Socket に置き換える
selectCoro::Select::select に置き換える
実装は・・・黒魔術的?
http://ma.la/files/yapcasia2009/
Coro::LWP の使い方
並列化したい箇所を async で囲む、これだけ
use Coro::LWP;
async { $ua = LWP::UserAgent->new; $req = HTTP::Request->new( GET => "http://example.com/"); $res = $ua->request($req); }
http://ma.la/files/yapcasia2009/
Perl : AnyEvent と Coro について復習
AnyEvent を使った並列化コールバックスタイルへの変更が必要すべてのプログラムを書き直す必要があるイベント駆動に慣れたプログラマーが必要
Coro を使った並列化継続の応用例IO::Socket 、 sleep 、 <$fh> などを置き換え同じ文法で並列化することが出来る手続き指向のまま記述することができる
http://ma.la/files/yapcasia2009/
POE::Component (昔流行したイベント駆動)
YAPC::Asia 2011 Tokyo チケット販売中!