Mojo::UserAgent 非阻塞与阻塞性能
Mojo::UserAgent non-blocking vs blocking performance
我有以下代码:
my $ua = Mojo::UserAgent->new ();
my @ids = qw(id1 id2 id3);
foreach (@ids) {
my $input = $_;
my $res = $ua->get('http://my_site/rest/id/'.$input.'.json' => sub {
my ($ua, $res) = @_;
print "$input =>" . $res->result->json('/net/id/desc'), "\n";
});
}
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
为什么当我 运行 上面的代码(非阻塞)时需要大约 6 秒,而当 运行 将代码设置为阻塞时,即在循环内部类似:
my $res = $ua->get('http://my_site/rest/id/'.$input.'.json');
print "$input =>" . $res->result->json('/net/id/desc'), "\n";
没有最新的一行大约需要1秒?
为什么阻塞代码比非阻塞代码快?
事情发生的第一件事就是检查。我无法得到同样的延迟。请记住对每种方式尝试多次,以发现出现网络问题的异常值。注意非阻塞sub的第二个参数是事务对象,一般写成$tx
,其中响应对象一般写成res
:
use Mojo::Util qw(steady_time);
say "Begin: " . steady_time();
END { say "End: " . steady_time() }
my $ua = Mojo::UserAgent->new ();
my @ids = qw(id1 id2 id3);
foreach (@ids) {
my $input = $_;
my $res = $ua->get(
$url =>
sub {
my ($ua, $tx) = @_;
print "Fetched\n";
}
);
}
一种可能是 keep-alive 正在保持打开的连接。如果你把它关掉会怎样?
my $res = $ua->get(
$url =>
{ Connection => 'close' }
sub {
my ($ua, $tx) = @_;
print "Fetched\n";
}
);
这是一个使用 promises 的版本,随着更多 Mojo 内容的加入,您需要习惯它:
use feature qw(signatures);
no warnings qw(experimental::signatures);
use Mojo::Promise;
use Mojo::Util qw(steady_time);
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
say "Begin: " . steady_time();
END { say "End: " . steady_time() }
my @ids = qw(id1 id2 id3);
my @gets = map {
$ua->get_p( 'http://www.perl.com' )->then(
sub ( $tx ) { say "Fetched: " . steady_time() },
sub { print "Error: @_" }
);
} @ids;
Mojo::Promise->all( @gets )->wait;
我有以下代码:
my $ua = Mojo::UserAgent->new ();
my @ids = qw(id1 id2 id3);
foreach (@ids) {
my $input = $_;
my $res = $ua->get('http://my_site/rest/id/'.$input.'.json' => sub {
my ($ua, $res) = @_;
print "$input =>" . $res->result->json('/net/id/desc'), "\n";
});
}
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
为什么当我 运行 上面的代码(非阻塞)时需要大约 6 秒,而当 运行 将代码设置为阻塞时,即在循环内部类似:
my $res = $ua->get('http://my_site/rest/id/'.$input.'.json');
print "$input =>" . $res->result->json('/net/id/desc'), "\n";
没有最新的一行大约需要1秒?
为什么阻塞代码比非阻塞代码快?
事情发生的第一件事就是检查。我无法得到同样的延迟。请记住对每种方式尝试多次,以发现出现网络问题的异常值。注意非阻塞sub的第二个参数是事务对象,一般写成$tx
,其中响应对象一般写成res
:
use Mojo::Util qw(steady_time);
say "Begin: " . steady_time();
END { say "End: " . steady_time() }
my $ua = Mojo::UserAgent->new ();
my @ids = qw(id1 id2 id3);
foreach (@ids) {
my $input = $_;
my $res = $ua->get(
$url =>
sub {
my ($ua, $tx) = @_;
print "Fetched\n";
}
);
}
一种可能是 keep-alive 正在保持打开的连接。如果你把它关掉会怎样?
my $res = $ua->get(
$url =>
{ Connection => 'close' }
sub {
my ($ua, $tx) = @_;
print "Fetched\n";
}
);
这是一个使用 promises 的版本,随着更多 Mojo 内容的加入,您需要习惯它:
use feature qw(signatures);
no warnings qw(experimental::signatures);
use Mojo::Promise;
use Mojo::Util qw(steady_time);
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
say "Begin: " . steady_time();
END { say "End: " . steady_time() }
my @ids = qw(id1 id2 id3);
my @gets = map {
$ua->get_p( 'http://www.perl.com' )->then(
sub ( $tx ) { say "Fetched: " . steady_time() },
sub { print "Error: @_" }
);
} @ids;
Mojo::Promise->all( @gets )->wait;