Ой, все испортил, когда красоту наводил. $AnyEvent::HTTP::MAX_PER_HOST = $max_connects; надо переместить на несколько строчек выше.
----- Original Message ----- From: ksvs <[email protected]> To: Moscow.pm group <[email protected]> Cc: Sent: Wednesday, 31 October 2012, 14:47 Subject: Re: [Moscow.pm] Event and fork $| = 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 <[email protected]> To: [email protected] 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 [email protected] | http://moscow.pm.orgпопробуй еще добавить -- Moscow.pm mailing list [email protected] | http://moscow.pm.org -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
