- 论坛徽章:
- 1
|
本帖最后由 iakuf 于 2013-11-06 13:35 编辑
上次 , 我想你看了用 Mojolicious 实现 写非阻塞的 (web) 应用 .在那个例子中, 每个动作都只执行了单个的非阻塞的动作. 在今天这篇文章中, 我打算讲深入一点.向你介绍 Mojo::IOLoop::Delay ,今天我们的例子会使用这个 delay 对象来等待同时执行的多个非阻塞的操作.直到他们完成操作之前, 在同一个进程内服务器都不会阻断其它请求的处理.
译者注: Mojo::IOLoop::Delay 这个模块是我最喜欢 Mojo 的一个原因, 大量的用到了这种技术, 这个模块做事件同步超级方便. 使用这种技术, 非常实用,例如, 我们一个动作可能要查询多次数据库, 我们可能想都查询出来,才做下一个动作. 我也写过一个这样的文章,可以看 "Mojolicious 之类事件程序的异步和技巧"
The Application
这个应用的演示和全部代码在 这, 通过这个例子, 这个应用的目标是从其它的 websites 站点取得网站标题的列表. 这是一个简单的任务,但非常有用,也能说明更加复杂的一些情况.
- #!/usr/bin/env perl
-
- use Mojolicious::Lite;
- app->ua->max_redirects(10);
-
- my @urls = qw/mojolicio.us mojocasts.com/;
-
- helper 'render_dumper' => sub {
- my $self = shift;
- $self->render( text => $self->dumper( \@_ ) );
- };
-
- # The routes will go here!
-
- app->start;
复制代码
必然,我需要导入 Mojolicious::Lite, 这会自动的导入 strict, warnings, utf8 和 v5.10 的特性. 每个应用内部其实有默认的 Mojo::UserAgent 的 ua 的 helper . 我们会在以后使用它. 接下来的行, 我们重新定义了 redirect 对每个请求最多可以 10 次. 接下来我们定义了一个 @urls 的列表, 是我们接下来要抓取的网站. 在这个例子中, 我其实建议你写更加多的网站地址, 但现在,我们只是一个演示.
我们可以通过 helper 来创建很多有意思的 rendering helper . 在这是一个简单的 web 接口的应用, 在这我们会给全部的参数通过我们自己创建的 Data::Dumper 的 helper 来 dump 出来. 当然 ,如果你有兴趣, 也可以给 render_dumper 这个自己的 helper 替换为 $self->render( json => [...] ) 这样会使用原生的 Mojo::JSON 来渲染这个数据结构,也会更加容易.
其它的路由的子函数没列出来, 我们先跳过这些. 现在我们启动我们的应用程序, 注意我们这个例子中没使用任何模板.
如果你存成 titles.pl 你可以这样运行
[code]perl titles.pl get |
|