2014-07-11 2 views
2

이것은 "use"문을 수정 한 코드입니다. 그들은 모두 원하는대로 작동합니다. 에서 POE :: Kernel-> run()이 멈추는 데 약 15 초가 걸림/

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, 그러나 그 후 나는 POE ::는 커널> 실행를 실행 한 후 return 문에 15 초 이상을 기다려야한다. 올바른 값을 반환하지만 그만큼 오래 기다릴 수는 없습니다. sub get_reponse 덤프 문 뒤에 exit를 추가하면 아무 값도 반환되지 않습니다.

모든 도움과 제안을 부탁드립니다.

답변

2

run() 모든 세션이 끝날 때까지 반환되지 않습니다. 여기에는 run()이 실행되는 동안 생성 된 세션이 포함됩니다.

첫 번째 POE 모듈을 사용하기 전에 POE::Kernel::TRACE_REFCNT 상수를 정의하면 프로그램 수명 기간 동안 사용중인 리소스의 덤프를 받게됩니다.

#!/usr/bin/perl 

use strict; 

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

# ... 

$poe_kernel->run(); 
exit 0; 
+1

감사합니다 : 당신이 그것으로 끝나면

즉시 해결을 폐쇄하는 가장 쉬운 방법은 종료로 HTTP 세션입니다. 나는 3 개의 세션을 가지고 있었다. –

+0

도와 드리겠습니다. 건배! –