perl - 如何清理仍在使用的 HTTP::Async

标签 perl http asynchronous timeout

我正在使用 Perl 库 HTTP::Async如下:

use strict;
use warnings;
use HTTP::Async;
use Time::HiRes;
...
my $async = HTTP::Async->new( ... );
my $request = HTTP::Request->new( GET => $url );
my $start = [Time::HiRes::gettimeofday()];
my $id = $async->add($request);
my $response = undef;
while (!$response) {
  $response = $async->wait_for_next_response(1);
  last if Time::HiRes::tv_interval($start) > TIME_OUT; 
}
...

while 循环超时且脚本结束时,我遇到以下错误消息:

HTTP::Async object destroyed but still in use at script.pl line 0
HTTP::Async INTERNAL ERROR: 'id_opts' not empty at script.pl line 0

我有什么选择?如果仍在使用但不再需要,如何“清理” HTTP::Async 对象?

最佳答案

我建议您删除不完整的请求,但该模块没有提供任何接口(interface)来执行此操作。


选项 1:添加删除功能。

将以下内容添加到您的脚本中:

BEGIN {
    require HTTP::Async;
    package HTTP::Async;

    if (!defined(&remove)) {
        *remove = sub {
            my ($self, $id) = @_;

            my $hashref = $self->{in_progress}{$id}
                or return undef;

            my $s = $hashref->{handle};
            $self->_io_select->remove($s);
            delete $self->{fileno_to_id}{ $s->fileno };
            delete $self->{in_progress}{$id};
            delete $self->{id_opts}{$id};

            return $hashref->{request};
        };
    }

    if (!defined(&remove_all)) {
        *remove_all = sub {
            my ($self) = @_;
            return map $self->remove($_), keys %{ $self->{in_progress} };
        };
    }
}

您应该联系作者,看看他是否可以添加此功能。 $idadd 返回的值。


选项 2:静默来自析构函数的所有警告。

如果您同意不满足所有请求,那么消除警告也没有什么坏处。您可以按如下方式进行操作:

use Sub::ScopeFinalizer qw( scope_finalizer );

my $async = ...;
my $anchor = scope_finalizer {
    local $SIG{__WARN__} = sub { };
    $async = undef;
};
...

请注意,这将消除对象销毁期间发生的所有警告,因此我不太喜欢这样做。

关于perl - 如何清理仍在使用的 HTTP::Async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10587962/

相关文章:

http - Tomcat 有时会返回没有 HTTP header 的响应

c# - DataTable不适合这种线程操作吗?

c#:在完成之前经过一定时间后重新启动异步任务

html - 试图在 xpath 读取值

multithreading - 如何在 Perl 中处理任何事件、RabbitMQ(心跳)和长时间运行的作业?

perl - Perl 中的基本网络聊天应用程序

Android Volley NetworkImageView 不适用于某些图像

javascript - 解析 Cloud Code httprequest 错误

c++ - 对象级 CSingleLock 与方法级 CSingleLock

c++ - 如何将 etrace 与动态库一起使用以按时间顺序跟踪 C++ 中的函数调用?