問題は、sleep
が AnyEvent の一部ではないため、AnyEvent::HTTP が非同期で取得できるようにするイベント ループを実行しないことです。ブロックするときは、条件変数などの AE 対応のものを使用してブロックしたいと考えています。
このプログラムは、という条件変数を作成し$exit_wait
、HTTP 要求を作成します。要求が行われ、応答が受信されている間、プログラムは実行を継続できます。
プログラムが HTTP 要求からの情報を必要とする段階に達するとrecv
、条件変数を呼び出します。これにより、HTTP 要求も完了したときにコールバックをトリガーできます。$headers
ハッシュをダンプするだけです。
この場合、コールバックsend
が条件変数に対しても実行するように記述しました。これにより、プログラムはrecv
呼び出しを終了して続行します。これがないと、プログラムは無限の待機状態になります。
あなたのアプリケーションについて詳しく知らなければ、これ以上お手伝いすることはできません。
use strict;
use warnings;
use AnyEvent::HTTP;
use Data::Dump;
STDOUT->autoflush;
my $exit_wait = AnyEvent->condvar;
my $handle = http_request
GET => 'http://www.nethype.de/',
sub {
my ($body, $headers) = @_;
dd $headers;
$exit_wait->send;
};
# Do stuff here
$exit_wait->recv;