AnyEvent and Plack
Post on 08-May-2015
5891 Views
Preview:
DESCRIPTION
Transcript
AnyEvent と Plack2009年11月30日 hiratara
アジェンダ
AnyEvent ( ついでに Coro も )
PSGI と Plack
AnyEvent とは
非同期処理のインタフェースを定義したもの
裏でイベントループが回っていることを想定(イベントループは普通シングルスレッド)
イベントループとは?
イベントを監視するループ。GUIでよく見られる
プログラマは、イベントに対応する処理を書く
イベントループがイベントに紐づく処理を呼び出すことで、プログラムの処理が進む
Perlの主なイベントループ
EV
Event
Glib
Tk
Perl
Event::Lib
Irssi
rxvt-unicode
IO::Async
Qt
POE
APIが全然違う
AnyEventの使い方use strict; use warnings;use AnyEvent;
my $done = AE::cv;
my $t1; $t1 = AE::timer 5, 0, sub { print "Waited 5 sec", "\n"; undef $t1; $done->send;};
$done->recv;
AnyEventの使い方
AE::cv → メインループを回して、計算させる
recv : 計算が終わるまでメインループを回す
send : 計算結果をrecvに返す
AnyEventの使い方
基本的に、イベント発生時のコールバックを渡す
(JavaScriptに似ている)
AE::timer : 一定時間経った後に呼び出すcb
AE::io : 入出力が終わった時に呼び出すcb
AnyEventと非同期処理
コールバック待ち時も、イベントループは回っている→ 非同期処理が可能
例: http://hogehoge.com/ のコールバックを待ちつつ http://foofoo.com/ の読み込みを開始できる
Coroとは?
Perlの1プロセッサでのスレッド(コンテキストスイッチ)
スレッドの切り替えは、明示的に行う(schedule や cede などのメソッドで切り替わる)
Coroの使い方use strict; use warnings;use Coro;use Coro::Timer;
async { Coro::Timer::sleep 5; print "Waited 5sec", "\n"; $Coro::main->ready;};
schedule;
Coroの使い方
schedule : 別スレッドに処理を移す (このスレッドは眠る)
ready : 眠ってるスレッドを起こす
陰でこっそり schedule と ready をやってくれる物も例 :
Coro::Timer::sleep (scheduleし、一定時間後にready)
CoroとAnyEvent
CoroとAnyEventはセットで話されることが多い
理由: Coro は AnyEventを使っている
こっそりと schedule と ready する処理
裏スレッドでイベントループを回し、コールバックでreadyさせている
PSGI
Perl の WSGI や Rack
WEBサーバ と Perl のインタフェースを定めたもの
WEBサーバ PerlのコードPSGI
PSGI
Plack::Server::CGI PerlのコードPSGIApache
CGI
mod_perl
Plack::Server::Apache2
Apache + mod_psgi
PSGI
PSGIlighttpd
Plack::Server::Standalone
PSGI
PSGIでHello World
use strict;use warnings;
sub { my $env = shift; return [ '200', [ 'Content-Type' => 'text/plain' ], [ "Hello World" ] ];};
Middleware
package XHeader;use strict;use warnings;use base Exporter::;our @EXPORT = qw/xheader/;
# xheader is a middleware to wrap $appsub xheader { my $app = shift; sub { my $env = shift; my $res = $app->($env); push @{$res->[1]}, 'X-PSGI-Used' => 1; return $res; };}
PSGIアプリケーションを変換
Plackとは
PSGI仕様のリファレンス実装(お手本となる実装のこと)
PSGIサーバの実装
PSGI準拠アプリのためのツール群
Plack
Plack::Server::CGI
PerlのコードPSGI
Plack::Server::Apache2
Plack::Server::Standalone
Plack::Server::AnyEvent
Plack::Server::Coro
Plack::Request
CGI::PSGI
CGI::Emulate::PSGI
Plack::Middleware::XXX
Plack::App::URLMap
Plack::App::Builder
plackup
psgi.streaming
PSGIの仕様。非同期にレスポンスを返すのに用いる
sub { my $env = shift; $env->{'psgi.streaming'} or die;
return sub { my $respond = shift; $respond->([ '200', [ 'Content-Type' => 'text/plain' ], [ "Hello World" ], ]); };};
そして Tatsumaki へ
Plack AnyEvent
TatsumakiPlack::Server::AnyEvent
Plack::Server::Coro
PSGIYour Application
AnyEvent
AnyEvent
Coro
top related