Node.js - Perl AnyEvent Coro

10
Perl : AnyEnvet と Coro とと サササササ ササShibuya.pm ササ ササ @TAKESAKO

Transcript of Node.js - Perl AnyEvent Coro

Page 1: Node.js - Perl AnyEvent Coro

Perl : AnyEnvet と Coro の復習

サイボウズ・ラボ/ Shibuya.pm

竹迫 良範 @TAKESAKO

Page 2: Node.js - Perl AnyEvent Coro

通常の 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/

Page 3: Node.js - Perl AnyEvent Coro

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/

Page 4: Node.js - Perl AnyEvent Coro

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;

Page 5: Node.js - Perl AnyEvent Coro

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

Page 6: Node.js - Perl AnyEvent Coro

Coro::LWP の動作

Coro は継続の実装 + 既存関数の置き換えブロックしそうなコードなのにブロックしないブロックしそうな箇所で他の Coro に処理を譲る

LWP で使用する IO::SocketCoro::Socket に置き換える

selectCoro::Select::select に置き換える

実装は・・・黒魔術的?

http://ma.la/files/yapcasia2009/

Page 7: Node.js - Perl AnyEvent Coro

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/

Page 8: Node.js - Perl AnyEvent Coro

Perl : AnyEvent と Coro について復習

AnyEvent を使った並列化コールバックスタイルへの変更が必要すべてのプログラムを書き直す必要があるイベント駆動に慣れたプログラマーが必要

Coro を使った並列化継続の応用例IO::Socket 、 sleep 、 <$fh> などを置き換え同じ文法で並列化することが出来る手続き指向のまま記述することができる

http://ma.la/files/yapcasia2009/

Page 9: Node.js - Perl AnyEvent Coro

POE::Component (昔流行したイベント駆動)

Page 10: Node.js - Perl AnyEvent Coro

YAPC::Asia 2011 Tokyo チケット販売中!