Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение многопоточности и Async, Parallel, Кто нибудь реально пробовал??? 
:(
    Опции темы
DurRandir
Дата 16.5.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 1
Всего: 17



Каждый вызов http_request ставит в очередь 1 запрос. Надо 10 параллельных запросов - надо выполнить 10 http_request. Но вызов $cv->recv блокирует дальнейшее выполнение, пока не будет вызван $cv->send (из колбека). И поэтому в очередь ставится всего 1 запрос. 
PM   Вверх
EcSYZ
Дата 17.5.2011, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 21.6.2007

Репутация: нет
Всего: 1



Вот из другого топика http://forum.vingrad.ru/topic-328733.html :
Код

#!/usr/bin/perl
$|=1;
use v5.10;
use strict;
use warnings;
use AnyEvent::HTTP;

my $threads=20;#кол-во одновременных запросов
my $threads_run=0;
$AnyEvent::HTTP::MAX_PER_HOST=$threads;#меняем дефолтное 4 на нужное нам кол-во одновременных запросов, т.е. 20

my @links;

#...
#подгрузка данных
#...

&cycle_run;

sub cycle_run
{
   while(scalar @links != 0){
      my $cv = AnyEvent->condvar;

      for(1 .. $threads){
         #если ссылок больше нет, то не пытаемся больше стартовать запросы
            last if(scalar @links == 0);
            &run($cv, pop @links);
      }
      last if($threads_run == 0);
      $cv->recv;
   }
}

sub run
{
   my $cv   = shift;
   my $link = shift;

   $threads_run++;
   http_request(
      GET     => $link,
      headers => { "user-agent" => 'Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.8.131 Version/11.10' },
      #proxy => [$host, $port[, $scheme]]
      timeout => 10,
      sub {
         #разные действия
         (--$threads_run) == 0 ? $cv->send : undef;
      }
   );
}

Вот примерно так. &cycle_run занимается стартом запросов и их отловом, а &run чисто за запросы отвечает и действия с ними.
В &cycle_run 2 цикла - while отвечает за перебор всех ссылок, а for - за создание запросов пачками по N штук.

Тут ещё немного инфы есть: http://likhatskiy.livejournal.com/1966.html
----------------------
Тот пример что я привёл ранее на Anyevent::HTTP не совсем правильный - он начинает обрабатывать 4 запроса, а остальные 96 запихивает в очередь, что не есть гуд.
PM MAIL WWW   Вверх
burakov
Дата 20.5.2011, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Попробовал работать в AnyEvent::HTTP - очень понравилось smile - на мой взгляд - действительно - это лучший модуль из всех паралелл, работает даже быстрее моего много поточного грабера - наверное действительно ДНС как-то кеширует (как в документации написано, если конечно я правильно перевел).
Единственный вопрос возник.
При работе с LWP::useragent, когда заголовки прописываешь, подделываешь не только заголовки как 

в посте выше 
{ "user-agent" => 'Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.8.131 Version/11.10' }
но и пишешь ему что $ua -> agent ('Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.8.131 Version/11.10')

Наверное это не одно и тоже, поскольку один хитрый сайт без прописания $ua-agent работать со мной отказался... :(

А как этого агента прописать используя модуль AnyEvent::HTTP , непонятно ...
или все таки 
в заголовке
{ "user-agent" => 'Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.8.131 Version/11.10' }
и 
$ua -> agent ('Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.8.131 Version/11.10')
это одно и тоже?


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
EcSYZ
Дата 20.5.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 21.6.2007

Репутация: нет
Всего: 1



headers => { "user-agent" => '...' }, - это тот самый юзер-агент из header`а запроса, даже специально щас проверил.
Вроде там можно ещё какие то замуты производить с Anyevent::Header, но тут я х\з если честно.
PM MAIL WWW   Вверх
burakov
Дата 21.5.2011, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Подскажите еще 
время от времени на одном из сайтов 
при грабке http::Anyevent
выдает код ошибки 596 хрен пойму что он означает, но чувствую, что ошибка происходит из за того, что Anyevent::Header не ждет долгого ответа от сайта (сайт нагружен и подтормаживает отвечать) - есть ли какой параметр чтобы ждать ответа подольше? Вроде у меня выставлено timeout => 5, но что это за таймаут? Ошибается только грабер на HTTP::Anyevent, а многопоточный который вытягивает контент при помощи LWP::UserAgent тянет нормально...

Вот что означает код
596 - errors during TLS negotiation, request sending and header processing.
но что это значит???

--
пробовал менять  timeout, точнее вообще не задавать его... написано что по умолчанию он 300 (непонятно в каких единицах - но как оказалось в секундах?)
так с таким дефолтным тайматом парсер вообще вешается на каком то моменте - это я так понимаю ждет какой то поток (меня об этом предупреждали) ну вообщем и все висит.

Если бы не было у меня моего многопоточного грабера я бы конечно подумал, что URL не отвечает - модуль ждет его timeout а затем по идее выдает код ошибки http. Но многопоточный грабер по всем этим ссылкам (граблю же один и тот же сайт) выдает 200 ОК и довольно быстро безо всякой задержки...

В чем же тут дело?

Это сообщение отредактировал(а) burakov - 21.5.2011, 22:35


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
JackYF
Дата 22.5.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162



Пожалуйста, одна тема - один вопрос.




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
EcSYZ
Дата 22.5.2011, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 21.6.2007

Репутация: нет
Всего: 1



timeout => 10 - это в секундах. дефолтное значение помоему 5 минут, что просто ТТ. С дефолтным значением парсер уходит в оооооочень долгое ожидание, по сути не совместимое с жизнью. Обычно хватает 5-10 на таймаут.
Код ошибки точно не помню, но некоторые не правильные урлы будут висеть пока не умрут по тайм ауту, например "http://site1.com/xxx/[email protected]" гарантировано звершается только по тайм ауту.
PM MAIL WWW   Вверх
Pfailed
Дата 22.5.2011, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Цитата(burakov @  21.5.2011,  22:13 Найти цитируемый пост)
errors during TLS negotiation, request sending and header processing.

Похоже на ошибку установления https соединения.
Если сайт долго не отвечает это не должно тормозить всю программу. Если тормозит значит у вас что-то неверно в самой программе.


--------------------
PM MAIL   Вверх
EcSYZ
Дата 22.5.2011, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 21.6.2007

Репутация: нет
Всего: 1



Цитата(Pfailed @ 22.5.2011,  14:09)
Похоже на ошибку установления https соединения.
Если сайт долго не отвечает это не должно тормозить всю программу. Если тормозит значит у вас что-то неверно в самой программе.

Это не чистая многопоточность, так что притормаживания в любом случае будут заметны на урлах с ошибками(которые умирают по таймауту).
PM MAIL WWW   Вверх
Pfailed
Дата 22.5.2011, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Цитата(EcSYZ @  22.5.2011,  17:47 Найти цитируемый пост)
Это не чистая многопоточность, так что притормаживания в любом случае будут заметны на урлах с ошибками(которые умирают по таймауту). 

С чего это вдруг? Тормоза будут заметны когда не будет справляться процессор или когда программа написана с ошибками, что в случае с событийно-ориентированным кодом очень легко.
Умирают по таймауту? Почему? Затянувшийся connect() или sysread()? Все эти операции производятся в неблокирующем режиме, поэтому не могут приостановить программу.


--------------------
PM MAIL   Вверх
burakov
Дата 22.5.2011, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



хрен поймешь
зависимость работы парсера от таймаут такая
если ставлю его = 5. то URL (одни и те же) идут то ответом 200, то 596,
если увеличиваю его по дефолту (то есть по сути сильно увеличиваю), то парсер подвисает.
Я пытаюсь Вас спросить - что это за параметр таймаут?
Я так для себя понял - что это время ожидания ответа от посланного http запроса, если в течении (когда =5) 5 секкунд ответа нет коннект отбрасывается с каким то кодом ошибки (ну пусть к примеру как у меня 596) так ли это?

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

по поводу того, что сам парсер написан неправильно...

ошибки идут только на конкретном сайте, кроме этого парсер был обробован и локально и на двух других - таких проблем не было ... работало четко.
Могу выложить весь код парсера 200 строк

Это сообщение отредактировал(а) burakov - 22.5.2011, 21:24


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
Pfailed
Дата 22.5.2011, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



burakov, приводите минимальный пример где проявляется эта ошибка. Тогда возможно и сможем сказать в модуле проблема или в вашем коде.


--------------------
PM MAIL   Вверх
burakov
Дата 22.5.2011, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



вот подпрограмма, которая берет ссылки из массива и тянет контент

Код

sub make_req {
    my @urls = @_;    @links = ();
    my $count = scalar (@urls);
    
    use AnyEvent::HTTP;
    $AnyEvent::HTTP::MAX_PER_HOST = $threads_all; #количество потоков из ини файла = 4

    my $cv = AnyEvent->condvar;

    foreach my $url (@urls) {
        my $host = $host;        #немного корректирую host, который потом вставляю в http_request
        $host =~ s/http:\/\///g; 
        http_request (
            'GET' => $url,
            headers => { 
                'Host' =>  $host,
                'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16',
            },            
            
            timeout => 5,
            
            sub {
                my ($body, $hdr) = @_;
                print $_[1]->{Status}." : $count : $url". "\n" ;            
                
                if ($_[1]->{Status} == 200) {
                    my $sql = 'update '.$table.' set state= "pass" where url="'.$url.'"';
                    $work_mysql -> run_query ($sql);

#работаю с контентом, сохраняю его в файл и т.п.
###############################################
                    my $content = $body;
                    my $clear_str = clear_str  -> new ($content); 
                    $content = $clear_str -> delete_1 ();
                    $content = $clear_str -> delete_4 ();
                    $clear_str = undef;
                    
                    my $workdir = get_base_path ().'/html'; 
                    my $file = get_file ($url);
                    $file = $workdir.'/'.$file; 
                    print $file."\n";
                    put_content_to_file ($content, $file); 

###############################################                    

                                        get_url_from_content ($content);  #беру ссылки и добавляю их к глобал @links
                    
                } else {
                    my $sql = 'update '.$table.' set state="false" where url="'.$url.'"';
                    $work_mysql -> run_query ($sql);
                }
                if (--$count == 0) {$cv->send;} else {undef;}
            }
        );    
    }
    $cv->recv;
    $cv = undef;
}


Данный парсер был опробован на нескольких сайтах (и локально на денвере и в интернете) и только на этом возникают ошибки 596.




--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
Pfailed
Дата 22.5.2011, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 2
Всего: 39



Не годится. Давайте код, который можно запустить и увидеть ошибки.


--------------------
PM MAIL   Вверх
EcSYZ
Дата 22.5.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 21.6.2007

Репутация: нет
Всего: 1



Кстате я тоже с таким сталкивался - был сайт, на котором паук сильно тупил. Сначала я пытался выцепить ссылки на которых тупит - оказались ссылки со встроенным видео плеером(хотя это никак не может ведь вызвать тормоза). Потом выцепил некоторые тупящие ссылки и ещё по 20 ссылок до и после для теста: ссылки работали нормально.
Короче, ситуация весьма неясная ... при 20 потоках грабер иногда убивает запросы по тайм-ауту, а при 1 потоке всё идёт ровно.
------------
Если урл убивается по тайм-ауту, то статус 597 (только что проверил)


PM MAIL WWW   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.