Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Асинхрон


Автор: newert 9.7.2010, 05:43
Доброе время суток.

Понадобилось срочно написать скрипт асинхронного получения html кода страниц.
Само получение страницы делаю через обычный HTTP::Request
Однако с асинхронностью получилась проблема.

Посмотрел документацию на HTTP::Async
и написал нечто вроде :

Код

$async->add( HTTP::Request->new( GET => 'URL' ) );
while ( my $response = $async->wait_for_next_response ) {
   ...
    callback(...);
}


Вроде даже и работает, но мне была поставлена задача реализовать это через библиотеку libEV, чего сделать у меня не вышло
Вообщем, 2 вопроса :
1) как реализовать это через libEV ? ( желательно привести в пример рабочий код, программка то простая )
2) какая реализация и через какие библиотеки будет наиболее оптимальна?

Автор: KSURi 9.7.2010, 12:05
AnyEvent::HTTP

Автор: newert 9.7.2010, 12:31
Спасибо.
Написал новый код. Вид и правда стал более логичным.

Код

#!/usr/bin/perl

use AnyEvent::HTTP;
my $kol = 0;
my $w = AnyEvent->condvar;

http_get "http://ru.wikipedia.org/wiki/LHC", sub { # код в $_[0];
    print "first complete!\n";
    $kol += 1;
    if ($kol==2){
        $w->send;
    } 
};
http_get "http://ya.ru", sub { # код в $_[0];
    print "second complete!\n";
    $kol += $kol+1;
    if ($kol==2){
        $w->send;
    } 
};

$w->recv;



А EV использовать никто не умеет? :(

Автор: ginnie 9.7.2010, 12:41
newert, посмотрите мой http://forum.vingrad.ru/index.php?showtopic=281244&view=findpost&p=2029439.

Автор: newert 9.7.2010, 13:06
Спасибо, сейчас посмотрю.
Вообщем, сдается мне, что AnyEvent и правда наиболее удобен для такой работы

Автор: newert 11.7.2010, 12:17
Где-то вычитал, что AnyEvent не поддерживает keep-alive, по умолчанию он может сделать к одному хосту только 4 соединения.

Никто не знает что можно с этим поделать?  smile 

Автор: KSURi 12.7.2010, 14:20
Цитата(newert @  9.7.2010,  12:31 Найти цитируемый пост)
А EV использовать никто не умеет? :(

AnyEvent - это обертка вокруг нескольких событийных машин (включая EV). Если AnyEvent обнаружит либу libev, то будет использовать её.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)