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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по POE 
:(
    Опции темы
Nab
Дата 2.3.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(tishaishii @  2.3.2007,  21:06 Найти цитируемый пост)
А шо воно такоэ?

О чем именно ты справшиваешь?
Если о POE, то по любому сначала вот сюда http://poe.perl.org/. А вообщето это  фраймворк реализующий невытесняющую многозадачность основанную на событийной модели. Очень хорош для всяких демонов, серверов, конечных автоматов и многого другого...



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
tishaishii
Дата 3.3.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

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



Понятно, ещё одна примочка для разработки.
Ну это не новость.
PM MAIL ICQ Skype   Вверх
shamber
Дата 3.3.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



tishaishii, примочка и еще какая!!! Очень удобно работать.
PM MAIL Jabber   Вверх
tishaishii
Дата 3.3.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

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



Мне удобно создать свой интерфейсный класс, от него родить нужные мне классы и написать что мне надо.
PM MAIL ICQ Skype   Вверх
Nab
Дата 3.3.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(tishaishii @  3.3.2007,  20:16 Найти цитируемый пост)
Мне удобно создать свой интерфейсный класс, от него родить нужные мне классы и написать что мне надо.

Интересно сколько времени на это у тебя уйдет smile



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
shamber
Дата 3.3.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Особенно на нечто подобное POE  smile 
PM MAIL Jabber   Вверх
DooZ
Дата 9.3.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Nab @ 1.3.2007,  05:56)
Просто я вот решил изучить POE переписывая свой проксичекер с форков на POE, и выяснил много интересного. А так как строил на тех же примерах, что и у тебя используются, могу подсказать где косяк у тебя smile

был бы благодарен за пример =)
PM MAIL   Вверх
Nab
Дата 11.3.2007, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(DooZ @  9.3.2007,  12:01 Найти цитируемый пост)
был бы благодарен за пример =)

Ок, объясню на твоем же примере ...
Цитата(DooZ @  29.12.2006,  21:50 Найти цитируемый пост)
вот есть массив с большим кол-вом ссылок скажем 100к ссылокможно ли как-то сделать, что бы работало в цикле, а именно типа
Код

foreach my $url (@url){
    POE::Session->create(
        inline_states =>{
            _start => sub {
            $_[KERNEL]->post(ua => request => got_response => GET $url)
            },
            got_response => \&client_handle_response
        }
    )
}

НО не как работает в данном варианте (ДОЛГО, ОЧЕНЬ ДОЛГО он думает потом начинает работу) а по мере поступления инфытобишь получил первую ссылку и погнал ее обрабатывать, в том время как дальше по циклу наполняются остальныет.е. сразу по мере получения начал отрабатывать


Если внимательно вчитаться в описание POE то там достаточно четко говориться что это такое и зачем, а именно 
Фраймворк управляемый событиями с невытесняющей многозадачностью...

А теперь объясню подробнее. Понятие невытесняющей исходит из того, что POE в изначальном варианте выполняется одним процессом и разделение времени выполнения между разными сессиями происходит внутри одного единственного процесса. А означает это то, POE само по себе, не может переключиться на другую задачу(сессию) для выполнения поставленной задачи или реагирования на событие...
Необходимо отдавать управление POE из своей процедуры, в особенности если она заведомо продолжительна во времени...

Следующее, сессия в POE в терминах операционнки, это как отдельный процесс. Посему создание сессии для каждого запроса это нонсенс :( думаю просто непонимание того как работает эта система, и невнимательное списывание с примеров... нигде такого даже не встречал :(
В цикле нужно посылать сообщения к определенной сессии, не более... 
И желательно давать возможность хоть иногда их отработать smile

Способов передать управление есть несколько, это и run_one_timeslice, и всякого рода таймауты, но самый простой это просто смена цикла на посылку сообщений самому себе...
Вот один из примеров как можно вызвать загрузку твоих урлов и начать получать ответы задолго до окончания списка... smile
Код


POE::Session->create(
    inline_states =>{
        _start => sub {
            # вот здесь первоначальный посыл запроса
            $_[KERNEL]->yield('send_request')
        },
        send_request => sub {
            # если урлы еще не кончились продолжаем их отсылать
            if (my $url = shift(@url)) {
                $_[KERNEL]->post(ua => request => got_response => GET $url);
                # вызывая каждый раз себя же, при этом давая возможность ядру отработать другие поставленные задачи
                # доставить сообщения, ответы на них и отработать другие возможные сессии
                $_[KERNEL]->yield('send_request')
            }
        },
        got_response => \&client_handle_response
    }
)


Для уменьшения нагрузки на CPU я применяю для таких достаточно длинных запросов такой запрос
                $_[KERNEL]->delay('send_request', 1)

нагрузка с 70-80% падает до 1% правда и время выполнения увеличивается вдвое, но все зависит от поставленной задачи, и приемлимой скорости проверки урлов...  Также временной промежуток можно другой поставить...

А вообще, я еще несколько решений у себя попробовал в процессе разделения задачи на части. И как результат, была написана парочка компонентов и один фильтр smile Но это уже немного другая тема...





--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
tishaishii
Дата 11.3.2007, 01:41 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

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



Цитата
Особенно на нечто подобное POE

В таких модулях, как правило, куча хлама - на все случаи жизни, который, как правило, в одном проекте весь не используюется. Так что не много времени, зато как надо.

Это сообщение отредактировал(а) tishaishii - 11.3.2007, 01:42
PM MAIL ICQ Skype   Вверх
Nab
Дата 11.3.2007, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(tishaishii @  11.3.2007,  01:41 Найти цитируемый пост)
В таких модулях, как правило, куча хлама - на все случаи жизни, который, как правило, в одном проекте весь не используюется. Так что не много времени, зато как надо.

Ну если следовать такой логике, то врядли все возможности перла используются в каждом проекте, может напишешь свою, облегченную версию?
Естественно некоторая избыточность присутствует, но обыкновенно в таких системах только необходимый функционал, а весь дополнительный вынесен во внешние компоненты, плагины и т.д. так что собирать нужный конструктор весьма недолго...
Зато получается, весьма расширяемая, хорошо сопровождаемая, и быстро написанная система... 
Естественно я не говорю о самодостаточных скриптах, которые раз написал и забыл...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
tishaishii
Дата 11.3.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

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



Вобщем, существует две концепции: использовать готовый код и писать свой. Это такая диалектика кодинга. Думаю, истина где-то по-середине, как обычно.
PM MAIL ICQ Skype   Вверх
G0rinich
Дата 30.3.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Nab, а не боишься такими темпами свалить процесс?

Да, POE::Component::Client::HTTP способен делать параллельно несколько запросов. Но отдать ему сразу 100К запросов - напряг smile
А если запросов надо сделать миллионы?

Во первых ссылки надо хранить в БД и брать их оттуда пачками.

Вот пример
Код

#!/usr/bin/perl -CDSA
use utf8; # encoding='utf-8'

use strict;
use HTTP::Request;
use HTTP::Headers;
use POE;
use POE::Component::Client::HTTP;
use POE::Component::Client::Keepalive;

local $| = 1;

our $JOBSMAX = 500;

POE::Component::Client::HTTP->spawn(
    'Alias'             => 'HTTP_CLIENT',
    'MaxSize'           => 300000,
    'Timeout'           => 300,
    'Agent'             => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)',
    'Streaming'         => 0,
    'FollowRedirects'   => 0, # если мы обработаем redirect этим способом, относительные ссылки будут неверны. Поэтому редирект должен быть просто скормлен извлекателю
    'ConnectionManager' => POE::Component::Client::Keepalive->new(
        'keep_alive'   =>  300,
        'max_open'     => 1000,
        'max_per_host' =>   10,
        'timeout'      =>   20,
    ),
);

our $DRIVER = require 'driver.pl';

our $JOB_MANAGER = POE::Session->create( # think POE...
    #~ 'options'      => {
        #~ 'trace'    => 1,
    #~ },
    'heap'          => {},
    'inline_states' => {
        '_start'    => sub {
            $DRIVER->{'init'}->();
            $_[KERNEL]->yield('get_jobs');
        },
        'get_jobs'  => sub {
            $_[KERNEL]->delay('get_jobs', 5);
            my $jobs_cnt = $_[KERNEL]->call('HTTP_CLIENT' => 'pending_requests_count');
            return if $jobs_cnt >= $JOBSMAX;
            $_[KERNEL]->post('HTTP_CLIENT' => 'request', 'job_done', $DRIVER->{'make_job'}->($_), $_->{'id'}) foreach @{$DRIVER->{'get_jobs'}->($JOBSMAX - $jobs_cnt)};
        },
        'job_done'   => sub {
            if ($_[ARG1]->[0]->is_success) {
                $DRIVER->{'complete'}->($_[ARG0]->[1], $_[ARG1]->[0]);
            } else {
                $DRIVER->{'error'   }->($_[ARG0]->[1]);
            }
        },
    },
);

POE::Kernel->run;


Ну и код драйвера:
Код

use strict;
use utf8;

{
    'name'      => 'first',
    'init'      => sub {},
    'get_jobs'  => sub {
        my $limit     = shift;
        [
            grep {$DB->query("update table set state='progress' where id ".$DB->in(map {$_->{'id'}} @$_))}
                  $DB->select("select * from table where state='wait' limit $limit")
        ]->[0];
    },
    'make_job' => sub {
        my $job = shift;
        HTTP::Request->new(
            'GET'        => $job->{'link'},
            HTTP::Headers->new('Connection' => 'Keep-Alive')
        );
    },
    'error'    => sub { $DB->query("update table set state='error'    where id=?", shift) },
    'complete' => sub {
        my $param    = shift;
        my $response = shift;
        
        # обрабатываем результат
        
        $DB->query("update table set state='ready' where id=?", $param);
    },
};


Код гарантированно рабочий.
Хавает ~10 линков в секунду.
Одновременно обрабатывает не более $JOBSMAX ссылок.

Это сообщение отредактировал(а) G0rinich - 30.3.2007, 14:10
PM MAIL   Вверх
Nab
Дата 30.3.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



G0rinich, молодец однако smile очень хороший и правильный код...

И все верно говоришь, можно запросто завалить не только весь проект smile но и сервер остановить забив все порты... Поэтому у меня  тоже есть ограничение, на количество поставленных в очередь запросов, и к примеру delay посылаеться когда достигли этой границы, иначе, забиваем очерель yield....

Хотелось немного проще показать как оно работает, чтобы сразу не отжирать кучу ресурсов и не создавать ненужные сессии стрвктуры, и т.д. Согласен, что с этими тонкостями человек столкнеся на следующем этапе, но они не принципиальны по сравнению к примеру со старым кодом smile А вообще спасибо за хороший пример...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
G0rinich
Дата 1.4.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Айс?
PM MAIL   Вверх
Ramirez
Дата 1.4.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

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



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


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

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


 




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


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

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