Perl : AnyEnvetと Coro の復習<br />サイボウズ・ラボ/Shibuya.pm<br />竹迫 良範 @TAKESAKO<br />
通常の Perl プログラミング(同期)<br />I/Oでブロック待ちが発生<br />use LWP::UserAgent;<br />$ua = LWP::UserAgent->new;<br />$req = HTTP::Request...
AnyEvent::HTTP::http_get(非同期)<br />#1 のリクエストが完了しないうちに#2, #3のリクエストも実行される<br />use AnyEvent::HTTP;<br />sub done {<br />    ...
AnyEvent::HTTP::http_get(実際の使い方)<br />use AnyEvent::HTTP;<br />my $cv = AnyEvent->condvar;<br />sub done {<br />    print ...
Coroを使うとどうなるか?<br />  use Coro;<br /># use Coro::LWP;<br />  use LWP::UserAgent;<br />async{<br />   print "Hello, world!¥...
Coro::LWP の動作<br />Coroは継続の実装 + 既存関数の置き換え<br />ブロックしそうなコードなのにブロックしない<br />ブロックしそうな箇所で他のCoroに処理を譲る<br />LWPで使用するIO::Socket<...
Coro::LWP の使い方<br />並列化したい箇所をasyncで囲む、これだけ<br /> use Coro::LWP;<br />async {<br />$ua = LWP::UserAgent->new;<br />$req = H...
Perl : AnyEventと Coro について復習<br />AnyEventを使った並列化<br />コールバックスタイルへの変更が必要<br />すべてのプログラムを書き直す必要がある<br />イベント駆動に慣れたプログラマーが必要...
POE::Component(昔流行したイベント駆動)<br />
YAPC::Asia 2011 Tokyo チケット販売中!<br />
Upcoming SlideShare
Loading in …5
×

Node.js - Perl AnyEvent Coro

3,070 views
2,951 views

Published on

Published in: Technology, Design
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,070
On SlideShare
0
From Embeds
0
Number of Embeds
16
Actions
Shares
0
Downloads
15
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Node.js - Perl AnyEvent Coro

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

×