【问题标题】:Why am I getting this perl Net::Async::HTTP warning?为什么我会收到这个 perl Net::Async::HTTP 警告?
【发布时间】:2017-12-10 16:48:37
【问题描述】:

在这个过于简化的脚本中,我使用IO::Async::Loop::EV 使用Net::Async::HTTP 进行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 可能有问题。 (我在不同的机器上试过这个,不同的操作系统 - 仍然收到这些警告)

为什么我多次收到此警告?你的机器上也会出现这种情况吗?

【问题讨论】:

  • 警告是否省略了文件名和行号?
  • @choroba 已编辑。警告在 IO::Async::Stream 的第 974 行

标签: perl asynchronous https


【解决方案1】:

似乎此警告特定于 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> 中止它。


我已将此作为针对 IO::Async::Loop::EV 的错误提出,https://rt.cpan.org/Ticket/Display.html?id=124030

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2012-08-10
    相关资源
    最近更新 更多