Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 具有Mojo::IOLoop::Delay的顺序请求_Perl_Asynchronous_Mojolicious - Fatal编程技术网

Perl 具有Mojo::IOLoop::Delay的顺序请求

Perl 具有Mojo::IOLoop::Delay的顺序请求,perl,asynchronous,mojolicious,Perl,Asynchronous,Mojolicious,我需要以非阻塞模式获取URL列表,但不能并行。它应该是一个接一个的连续请求。我怎么能意识到这一点 我找不到例子。文档和文章只强调并行执行 现在,我的代码如下所示(简化): 我想通过使用避免多个闭包。 我刚刚开始考虑自己的项目,我还不太熟悉。但我认为最简单的方法是构建一个闭包数组,并将其传递给$delay->steps 使用严格; 使用“全部”警告; 使用特征“说”; 使用魔咒; 使用常量URL=>'http://stackoverflow.com/questions/tagged/perl';

我需要以非阻塞模式获取URL列表,但不能并行。它应该是一个接一个的连续请求。我怎么能意识到这一点

我找不到例子。文档和文章只强调并行执行

现在,我的代码如下所示(简化):

我想通过使用避免多个闭包。

我刚刚开始考虑自己的项目,我还不太熟悉。但我认为最简单的方法是构建一个闭包数组,并将其传递给
$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;