[Moscow.pm] Event and fork

ksvs ksvs1996 на ymail.com
Ср Окт 31 05:47:15 PDT 2012



$| = 1;
use strict;
use warnings;

use AnyEvent;
use AnyEvent::Impl::EV;
use AnyEvent::HTTP;

use Foo;


open FILE, "<urls.txt" or die $!;
my @urls = map { chomp; $_ } <FILE>;
close FILE;

my $cv = AnyEvent->condvar;

my $max_connects = 33;
my $cnt = @urls > $max_connects ? $max_connects : @urls;
foreach (1 .. $cnt) {
    add_request();
}

$AnyEvent::HTTP::MAX_PER_HOST = $max_connects;

my $i;
sub add_request {
    my $url = shift @urls or return;
    $i++;
    http_request GET => $url, sub {
        $i--;
        my $data = $_[0];
        my ($code, $message, $url) = @{$_[1]}{qw(Status Reason URL)};
        my $foo = foo($url, $data);
        print "$code ($message)\t$url\t$foo\n";
        if (@urls) {
            add_request();
        } else {
            $cv->send unless $i;
            # EV::unloop() unless $i;
        }
    };
}


# EV::loop();
$cv->recv;

________________________________
From: Mons Anderson <inthrax на gmail.com>
To: moscow-pm на pm.org 
Sent: Wednesday, 31 October 2012, 13:58
Subject: Re: [Moscow.pm] Event and fork


1. Покажите мне пожалуйста ваш код на AnyEvent.

2. Перед <use AnyEvent> ведь правда написано <use EV>?
      и в конце программы написано EV::loop(), а не AE::cv->recv?

3. Если сравнивать время 1 запроса AnyEvent'ом и 1 запроса LWP
      (или Curl), то это время будет зависеть во многом от внешнего
      ресурса.
вы сделали параллель по 33 коннекта. т.е. в принципе вы выполняете
      последовательность из ~34 запросов. (1123/33)
и неважно чем, LWP или AnyEvent'ом, вы замерили максимальное время
      последовательных 34 запросов.

Сила AnyEvent'а в том, что в одном процессе вы пожете
      "параллельно" выполнять пару сотен таких задач.
если-бы у вас урлы были не на одном домене (perl.com), а на
      разных, то можно было-бы отправить их всех одновременно.

PS: в AnyEvent::HTTP есть ограничение на одновременное подключение
      к одному домену.

$AnyEvent::HTTP::

      MAX_PER_HOST = 33;

On 10/30/2012 03:43 PM, ksvs wrote:

Привет.
>Решил все таки посмотреть на AnyEvent::HTTP.
>Сделал скачивание страниц сайта perl.com по заранее
                приготовленному списку url (1123 ссылки).
>
>
>Однопоточный LWP справляется с этим за 7:53 минут
>HTTP::Async (33 одновременных соединения) - 1:55
>AnyEvent::HTTP (33 одновременных соединения) - 0:38
>Coro::LWP (33 одновременных соединения) - 0:21
>
>Наверно AnyEvent::HTTP медленней, чем Coro::LWP из-за
                того, что не кешируется DNS.
>А последние версии AnyEvent и AnyEvent::CacheDNS не
                совместимы друг с другом.
>
>А вот вариант с prefork в 10 дочерних процессов
                справился за 0:48.
>Каждому дочернему процессу передается по одному url, он
                возвращает результат и ему передается следующий url)
>
>На компьютере 4 ядра.
>
>А в 33 потока prefork справился быстрей всех - 0:17
>
>
>Чтобы тесты не были слишком искусственными, я добавил
                анализ страниц при помощи HTML::Parser (поиск внешний и
                внутренних ссылок).
>
>LWP -                 9:22
>AnyEvent::HTTP (33) - 1:12
>Coro::LWP (33) -      1:17
>prefork (10) -        0:54
>prefork (33) -        0:23
>
>затем все таки уговорил себя и сделал гибридный вариант: 
>prefork (4 процесса) и в каждом 8 Coro - 0:24
>prefork (4 процесса) и в каждом 33 Coro - 0:24
>prefork (4 процесса) и в каждом 33 AnyEvent::HTTP - 0:22
>
>Кстати, когда снял нагрузку (анализ страниц), то
                заметил, что вариант prefork-Сoro иногда зависает, а
                вариант prefork-AnyEvent::HTTP - нет.
>
>
>Что я могу сказать по всему этому. Было интересно. Но
                наверное, использование Event оправдано лишь для узкого
                круга задач, где куча медленных соединений и задачи эти
                не нагружают CPU. Но для этого вероятно проще
                использовать тот-же Erlang и Haskell, которые сами все
                ядра использую.
>
>Хотя ведь при общении с дочерними процессами
                используется select или прочий event.
>
>А для каких задач вы используете AnyEvent?
>
>P.S.
>
>Кстати, об Erlang.
>
>Не смотря на фразу "Слава Богу, я не подписан на из
                списки рассылки", я решил посмотреть на Erlang.
>Больше меня удивило, что периодически пользователи
                Erlang доказывают, что Erlang круче, чем node.js.
>
>Но, ведь, если я правильно понял, Erlang на уровень
                выше, чем node.js и AnyEvent.
>Так почему они что-то пытаются доказать? Ведь слон на
                Моську не обращает внимания.
>Или в Erlang есть какой-то подводный камень, который
                скрывают?
>
>P.P.S
>А что еще есть интересного в Perl? Подскажите
                направление?
>
>

-- 
Moscow.pm mailing list
moscow-pm на pm.org | http://moscow.pm.orgпопробуй еще добавить      


Подробная информация о списке рассылки Moscow-pm