在独立的 Perl 脚本中使用 Mojo::Promise
Using Mojo::Promise in a stand-alone Perl script
在独立的 Perl 脚本中,我需要对外部 Web 服务进行并发调用(下面在 $number+1
中模拟)。我想我会重新使用我的 Mojo::Promise 代码,但它没有用 - on_done()
代码没有执行。
我愿意在 Perl 中使用更好的方法(队列?)。
#!/usr/bin/env perl
use Mojo::IOLoop;
use Mojo::Promise;
use Future::Utils 'fmap_concat';
####### STASH ######
my $result_future; #
####################
my $count = 100;
my @numbers = 1..$count;
if (@numbers) {
my $result_f = fmap_concat {
my $number = shift;
my $p = Mojo::Promise->new;
Mojo::IOLoop->subprocess(
sub {
#sleep 2;
return $number+1;
},
sub {
my ($subprocess, $err, @result) = @_;
return $p->reject($err) if $err;
$p->resolve(@result);
});
return $p->with_roles('Mojo::Promise::Role::Futurify')->futurify;
} foreach => \@numbers, concurrent => 20;
$result_f
->on_done(
sub {
my @values = @_;
foreach my $response (@values) {
print STDERR "Response='$response'\n";
}
})
->on_fail(
sub {
my $error = shift;
print STDERR "# ERROR='$error'\n";
})
->on_ready(
sub {
$result_future = undef;
})
;
# Must keep a reference to Futures until we're done with them.
$result_future = $result_f;
}
print STDERR "Processing $count numbers\n"
由于您没有在已经 运行 的事件循环中使用此代码,因此您需要自己 运行 事件循环才能发生任何事情。最简单的方法是等待您的 Futures 完成。
$result_f->await;
在这种情况下无需保留单独的 $result_future
引用,因为该语句将阻塞,直到 Futures 准备就绪。这个和相关的 ->get
(如果成功就是 ->await
,return 结果,如果失败则抛出异常)是 Futures 允许你 运行 非阻塞的主要机制按顺序编码。
在独立的 Perl 脚本中,我需要对外部 Web 服务进行并发调用(下面在 $number+1
中模拟)。我想我会重新使用我的 Mojo::Promise 代码,但它没有用 - on_done()
代码没有执行。
我愿意在 Perl 中使用更好的方法(队列?)。
#!/usr/bin/env perl
use Mojo::IOLoop;
use Mojo::Promise;
use Future::Utils 'fmap_concat';
####### STASH ######
my $result_future; #
####################
my $count = 100;
my @numbers = 1..$count;
if (@numbers) {
my $result_f = fmap_concat {
my $number = shift;
my $p = Mojo::Promise->new;
Mojo::IOLoop->subprocess(
sub {
#sleep 2;
return $number+1;
},
sub {
my ($subprocess, $err, @result) = @_;
return $p->reject($err) if $err;
$p->resolve(@result);
});
return $p->with_roles('Mojo::Promise::Role::Futurify')->futurify;
} foreach => \@numbers, concurrent => 20;
$result_f
->on_done(
sub {
my @values = @_;
foreach my $response (@values) {
print STDERR "Response='$response'\n";
}
})
->on_fail(
sub {
my $error = shift;
print STDERR "# ERROR='$error'\n";
})
->on_ready(
sub {
$result_future = undef;
})
;
# Must keep a reference to Futures until we're done with them.
$result_future = $result_f;
}
print STDERR "Processing $count numbers\n"
由于您没有在已经 运行 的事件循环中使用此代码,因此您需要自己 运行 事件循环才能发生任何事情。最简单的方法是等待您的 Futures 完成。
$result_f->await;
在这种情况下无需保留单独的 $result_future
引用,因为该语句将阻塞,直到 Futures 准备就绪。这个和相关的 ->get
(如果成功就是 ->await
,return 结果,如果失败则抛出异常)是 Futures 允许你 运行 非阻塞的主要机制按顺序编码。