【发布时间】:2013-07-01 11:47:35
【问题描述】:
首先我是 Perl 和 Mojo 的新手,所以我会尽我所能.. :D
问题在于我需要并行工作,因此该服务需要每秒处理多个调用。该服务将允许其他服务通过 REST 连接以下载和处理文件。我正在对这个想法进行一些测试,但没有成功。
我一直在围绕 Mojo::IOLoop 进行测试,但我认为我误解了一些概念,因为使用循环和计时器的每个实现都绝对错误...
实际上我的工作流程在这里:
(1) 获取 REST 调用
(2) 验证通过 mongodb 提供的 url
(3) 下载与该 mongo 对象关联的文件。
所以实际上这是可行的,但我看不出如何实现它以并行工作......
#!/usr/bin/env_perl
use Mojolicious::Lite;
use MongoDB;
my $mongo = MongoDB::MongoClient->new(host => 'xxxx.mongohq.com',port => 'xxxxx', username => 'xxxxx', password => 'xxxxx', db_name => 'xxxxx');
my $database = $mongo->get_database( 'xxxxx' );
my $collection = $database->get_collection( 'xxxxx' );
any [qw/ get post /] => '/:action/:objid' => sub {
my $self = shift;
#Parsing objectid...
my $objectid = $self->param('objid');
my $id = MongoDB::OID->new(value => $objectid);
my $all = $collection->find({_id => $id});
my $dts = $all->next;
download($dts->{parsedoc}->{url},"final_name.xml");
};
app->start;
sub download {
say "Starting new download..";
my $ua = Mojo::UserAgent->new(max_redirects => 5);
my $tx = $ua->get($_[0]);
$tx->res->content->asset->move_to($_[1]);
say "Download ends.";
}
在这里实现 IOLoop 的最佳方式是什么?我一直在使用一些 mojo 计时器示例,但也许我需要重新排序我的应用程序流程?提前致谢。
【问题讨论】:
-
IOLoop 不是并行工作,而是非阻塞工作。因此,您需要一个非阻塞的 Mongo 客户端。我知道 Mojolicious 的作者一直在写一个叫 Mango,但它目前处于 alpha 状态。
标签: perl rest parallel-processing mojolicious