Perl 具有Mojo::IOLoop::Delay的顺序请求
我需要以非阻塞模式获取URL列表,但不能并行。它应该是一个接一个的连续请求。我怎么能意识到这一点 我找不到例子。文档和文章只强调并行执行 现在,我的代码如下所示(简化): 我想通过使用避免多个闭包。 我刚刚开始考虑自己的项目,我还不太熟悉。但我认为最简单的方法是构建一个闭包数组,并将其传递给Perl 具有Mojo::IOLoop::Delay的顺序请求,perl,asynchronous,mojolicious,Perl,Asynchronous,Mojolicious,我需要以非阻塞模式获取URL列表,但不能并行。它应该是一个接一个的连续请求。我怎么能意识到这一点 我找不到例子。文档和文章只强调并行执行 现在,我的代码如下所示(简化): 我想通过使用避免多个闭包。 我刚刚开始考虑自己的项目,我还不太熟悉。但我认为最简单的方法是构建一个闭包数组,并将其传递给$delay->steps 使用严格; 使用“全部”警告; 使用特征“说”; 使用魔咒; 使用常量URL=>'http://stackoverflow.com/questions/tagged/perl';
$delay->steps
使用严格;
使用“全部”警告;
使用特征“说”;
使用魔咒;
使用常量URL=>'http://stackoverflow.com/questions/tagged/perl';
标准输出->自动刷新;
my$ua=Mojo::UserAgent->new;
my$delay=Mojo::IOLoop::delay->new;
my@URL=(URL)x 10;
我的@steps=map{
我的$url=$\;
潜艇{
my$end=$delay->begin;
$ua->get($url=>sub{
我的($ua,$txn)=@;
$end->();
if(my$err=$txn->error){
说$err->message;
}
否则{
我的$res=$txn->成功;
说“@{$res}{qw/code message/}”;
}
});
}
}@url;
$delay->steps(@steps,sub{say'Done});
Mojo::IOLoop->启动,除非Mojo::IOLoop->正在运行;
输出
200正常
200行
200行
200行
200行
200行
200行
200行
200行
多恩
200行
请注意,Done
打印在最终的get
的状态行之前,因为我在回调到达后立即调用了$end->()
,假设响应的任何处理都不需要同步
如果您不想这样做,那么只需将
$end->()
移动到回调的末尾。然后,延迟将等到输出生成后再发送另一个请求,这非常容易实现
Web服务器
脚本
脚本(动态请求)
什么是
$ua
?而build\u report
do做什么呢?$ua是Mojo::UserAgent;build_报告在摘要报告中收集来自所有请求的数据。这没关系,但我不知道列表中将包含多少URL。我必须在delay()中动态添加sub。我找不到该怎么做。我更新了帖子以添加示例,但我认为如果您能够毫不延迟地完成闭包,代码可能会看起来更漂亮。我必须使用延迟,因为它是web服务器,它应该立即返回答案。所以,它应该是异步的。链接下的示例与我的代码相同。我不喜欢。延迟不允许您立即执行请求。延迟需要按顺序编写代码。所以您只需要删除延迟,因为没有延迟的代码看起来更清晰。我更新了我的要点,增加了两个例子:毫不延迟和另一个延迟。再次点击示例!callback.dynamic.sequential.pl看起来非常漂亮,但我应该将最终函数build_report()放在哪里?它应该将所有请求汇总到一个订单中。谢谢,这正是我需要的!
my $delay = Mojo::IOLoop::Delay->new;
$delay->steps(
sub {
build_report();
say "done";
}
);
sub parse_data {
...;
my $url = shift @urls;
my $end = $delay->begin;
$ua->get( $url => \&parse_data );
$end->();
}
my $end = $delay->begin;
$ua->get( $url => \&parse_data );
$end->();
$delay->wait;
#!/usr/bin/perl
use Mojo::Base -strict;
use Mojolicious::Lite;
get '/' => sub {
my $c = shift->render_later;
$c->delay(sub {
my $delay = shift;
$c->ua->get('https://google.ru' => $delay->begin);
}, sub {
my ($delay, $tx) = @_;
$tx->res->body; # body of the google.ru
$c->ua->get('https://twitter.com' => $delay->begin);
}, sub {
my ($delay, $tx) = @_;
$tx->res->body; # body of the twitter.com
$c->render(text => 'Done');
});
};
app->start;
#!/usr/bin/perl
use Mojo::Base -strict;
use Mojo::IOLoop;
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
Mojo::IOLoop->delay(sub {
my $delay = shift;
$ua->get('https://www.google.ru' => $delay->begin);
}, sub {
my ($delay, $tx) = @_;
$tx->res->body; # body of the google.ru
$ua->get('https://twitter.com' => $delay->begin);
}, sub {
my ($delay, $tx) = @_;
$tx->res->body; # body of the twitter.com
warn 'DONE';
})->wait;