PerlBeginners#13の復習- Mojoliciousでsleepしてみた
xtetsujiさんのsleepの話は奥深く 最近チャットアプリを書くようになって、IOLOOPなるものがでてきてかなり気にするようになってきた。止めちゃいけないと言われると止めてみたくなった。
さて、以下のようにして、Mojolicious::Liteアプリを作り
mkdir hoge
cd moge
mojo generate lite_app hoge
hogeファイルを編集してみましょう。
#!/usr/bin/env perl use Mojolicious::Lite; # Documentation browser under "/perldoc" plugin 'PODRenderer'; get '/' => sub { my $self = shift; sleep(10); $self->render('index'); }; get '/hoge' => sub { my $self = shift; $self->render('hoge'); }; app->start; __DATA__ @@ hoge.html.ep % layout 'default'; % title 'Hoge'; Hoge!!! @@ index.html.ep % layout 'default'; % title 'Welcome'; Welcome to the Mojolicious real-time web framework! @@ layouts/default.html.ep <!DOCTYPE html> <html> <head><title><%= title %></title></head> <body><%= content %></body> </html>
アプリを起動して
morbo hoge
ブラウザで以下の順番でWEBアプリを起動させてみてください。 http://localhost:3000/
indexはもちろんのこと、hogeの返却も待たされました。 要するに同時に動けるIOLoopは1つしかいないということか。
これは困りものです。なんとか、hogeの返却は待たせないで救いたい。 さぁ、どうすればいいのでしょうか?!
こんな感じにして、自分の処理はさくっと終了して、後から呼んでもらえばいいんです。
get '/' => sub { my $self = shift; Mojo::IOLoop->timer(10 => sub { $self->render('index'); }); };
http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Timers
また、sleepでなくても、処理時間のかかりそうなWebAPI処理を見たら 非同期処理に変えないと、ほかの人たちにも迷惑がかかっちゃいますね。 それについては、こちらにまとまっていました。
http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Backend_web_services
一つしかループがないというキーワードでnode.jsを思い出した。Mojoliciousも node.jsと同じような仕組みなんですね。今更ながら、何も知りませんでしたww スレッドモデルだと、他のスレッドは被害を免れるのですが、イベントループだと そうはいかないというところが胆なのかな?
http://blog.livedoor.jp/eitake0002/archives/34300866.html