在这个过度简化的脚本中,我使用Net::Async::HTTP与IO::Async::Loop::EV进行GET请求:
use Modern::Perl '2017';
use IO::Async::Loop::EV;
use Net::Async::HTTP;
use Future;
my $loop = IO::Async::Loop::EV->new;
my $http = Net::Async::HTTP->new(max_redirects => 0);
$loop->add($http);
my $f = $http->GET('https://www.perl.org')
->then(sub {
my $response = shift;
printf STDERR "got resp code %d\n", $response->code;
return Future->done;
});
$http->adopt_future($f->else_done);
$loop->run;
我多次收到这个警告:
EV: error in callback (ignoring): Can't call method "sysread" on an undefined value at .../IO/Async/Stream.pm line 974
我在使用IO::Async::Loop::Event时也会收到此警告(再次在IO::Async::Stream,第974行)。
但是,对于非安全(http)链接,一切看起来都不错。所以IO::Async::SSL可能有些不对劲。 (我在不同的机器上尝试了这个,使用不同的操作系统 - 仍然收到这些警告)
为什么我多次收到此警告?它也会出现在你的机器上吗?
答案 0 :(得分:0)
此警告似乎特定于IO::Async::Loop::EV
实施。如果你只是
use IO::Async::Loop;
my $loop = IO::Async::Loop->new;
然后它似乎工作得很好。除非你为特定目的选择它,否则最好避免它,只需让IO::Async::Loop->new
魔术构造函数找到一个好的。
此外,而不是用
结束脚本$loop->run
您可以改为使用
$f->get
所以它执行阻塞等待,直到Future
完成,然后干净地退出,以免<Ctrl-C>
中止。