鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

PerlBeginners#13の復習- Mojoliciousでsleepしてみた

Perl Beginners #13 開催しました

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/

http://localhost:3000/hoge

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

後で読む

http://www.slideshare.net/xtetsuji/ss-25772137