perl - POE::Kernel->run() 大约需要 15 秒才能停止/

标签 perl httpresponse poe

这是我的代码,已编辑了“use”语句。它们都按预期工作。

my $json_data;

sub request {
    my ( $method, $container, $params, $content_type) = @_;

    #get the complete URL, works fine
    my $full_url = get_url( $method, $container, $params, $content_type);

    POE::Component::Client::HTTP->spawn(Alias => 'ua');

    # Start a session that will drive the resolver.
    # Callbacks are named functions in the "main" package.
    POE::Session->create(
    inline_states => {
        _start       => \&_start,
        got_response => \&got_response,
        }
    );

    POE::Kernel->run();
    return $json_data;
}

sub _start {
    my $kernel = $_[KERNEL];
    $kernel->post("ua" => "request", "got_response", $full_url);
}

sub got_response {
    my ($response_packet) = $_[ARG1];

    my $http_response = $response_packet->[0];
    my $response_string = $http_response->decoded_content();
    $json_data = decode_json( $response_string);
    print Dumper $json_data;
}

got_response中的Dumper会立即打印该值,但之后我必须在POE::Kernel->run之后等待至少15秒才能返回语句执行。它返回正确的值,但我不能等那么久。 如果我在 sub get_reponse dumper 语句之后添加 exit,则不会返回任何值。

任何帮助和建议将不胜感激。

最佳答案

run() 在每个 session 结束之前不会返回。这包括在 run() 运行时创建的 session 。

在使用第一个 POE 模块之前定义常量 POE::Kernel::TRACE_REFCNT,您将收到在程序的整个生命周期中使用的资源的转储。

#!/usr/bin/perl

use strict;

sub POE::Kernel::TRACE_REFCNT () { 1 }
use POE;

# ...

$poe_kernel->run();
exit 0;

关于perl - POE::Kernel->run() 大约需要 15 秒才能停止/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24700118/

相关文章:

Perl 导入我所有的包?

linux - 今天无法解析 Linux 日志文件

java - 如果容器身份验证失败,如何修改 Java servlet 响应 header ?

java - 在 Java 中检索 Http 响应状态的最快方法

c# - 从 Web Api Controller 返回 http 状态代码

perl - 如何针对 POE EasyDBI 编写测试?

perl - 如何模拟内置运算符

linux - 在 Centos 7 上运行 Perl 5 并尝试安装和使用 gtk/gtk2

perl - 如何正确关闭 Bot::BasicBot 机器人(基于 POE::Component::IRC)?

perl - 如何理解POEM-To destroy的使用?