LINUX.ORG.RU

Perl AnyEvent-HTTP идентифицировать callback

 , ,


0

4

Доброго времени суток уважаемое сообщество !

возникла необходимость проверять на доступность несколько тысяч url, решил использовать для этого AnyEvent::HTTP как наиболее быстрый, на мой взгляд

делаю стандартно в цикле запрос http_head (по 100 за раз)

my $cv = AnyEvent->condvar();

my $guard;
$guard = http_head($url, timeout => 1, sub {
    undef $guard;
    my $header = $_[1];
    if($header->{'Status'} =~ /^2/){
		print "Status: OK\n";
    }
    else{
        $log->info("Status: Error,  $header->{'Reason'}");
    }
	if($max_request == $y){
		$cv->send("done");
	}
});

my $result = $cv->recv();

это всё дело как-бы работает, и довольно шустро но проблема в чём, не могу из callback определить к какой url он принадлежит, ведь url http_head($url ... и $header->{'URL'} это вовсе не всегда 1но и то-же а при возникновении ошибки (перенаправление, недостпность что-то ещё) мне нужно потом сообщить что такой-то url с таким-то id недоступен

пробовал ввести id для url (точнее они и так есть в БД где хранятся url) но тоже не получилось, ибо callback-и выполняются в произвольном порядке

подскажите если не трудно есть ли какой-то способ из callback выяснить какой http_head($url ... его вызвал ?



Последнее исправление: bodigard (всего исправлений: 1)

Самое простое - сделать обертку:

my $cv = AnyEvent->condvar();
my $guard;

sub http_check_url {
	my $url = shift;
	return http_head($url, timeout => 1, sub {
		undef $guard;
		my $header = $_[1];
		if($header->{'Status'} =~ /^2/){
			print "${url} Status: OK\n";
		}
		else{
			$log->info("${url} Status: Error,  $header->{'Reason'}");
		}
		if($max_request == $y){
			$cv->send("done");
		}
	});
}

$guard = http_check_url($url);

my $result = $cv->recv();

joy4eg ★★★★★
()
Ответ на: комментарий от joy4eg

благодарю за помощь ! но при таком варианте почему-то выполняется только 1 callback, хотя в очередь встают сколько нужно (я 10 для проверки ставлю)

bodigard
() автор топика

Всё просто, это типичный пример использования замыкания

for my $url (@urls) {
	http_head $url, sub {
		# do smth
		warn "$url - finished"; # right $url available here
	}
}

Т.к. на каждой итерации $url создаётся через my, то по идеи она в конце итерации должна быть уничтожена, но т.к. она используется внутри коллбека, то в нём остается жива. При этом на следующей итерации создаётся новая $url, но это не затрагивает ту, что уже используется в коллбеке. В итоге в каждом коллбеке правильный $url.

Olegymous ★★★
()
Последнее исправление: Olegymous (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.