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

Поиск:

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


Бывалый
*


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

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



вопрос
есть пример:
Код

#!/usr/bin/perl

use warnings;
use HTTP::Request::Common qw(GET POST);
use POE qw(Component::Client::HTTP);

my @url_list = (
    "http://poe.perl.org/misc/test.html",
    "http://poe.perl.org/?POE_Cookbook/Web_Client"
);

POE::Component::Client::HTTP->spawn( Alias => 'ua' );

sub got_response {
    my ( $heap, $request_packet, $response_packet ) = @_[ HEAP, ARG0, ARG1 ];

    my $http_request  = $request_packet->[0];
    my $http_response = $response_packet->[0];

    my $response_string = $http_response->as_string();
    $response_string =~ s/^/| /mg;
    print ",", '-' x 78, "\n";
    print $response_string;
    print "`", '-' x 78, "\n";
}

sub _start {
    my $kernel = $_[KERNEL];

    foreach my $url (@url_list) {
        $kernel->post( "ua" => "request", "got_response", GET $url);
    }
}

POE::Session->create(
    package_states => [ main => [ "_start", "got_response" ] ]
);

$poe_kernel->run();


все работает, все ок

но если списко урлов будет скажем 10к и более скрипт ОЧЕНЬ-ОЧЕНЬ долго думает (функция _start думает)
после чего вылетает с ошибкой типа:
Can't locate Net/DNS/RR/A.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.6/i386-linux-thread-multi /usr/lib/perl5/5.8.6 .) at (eval 64) line 3.

что за бредятина?

ставлю допустим 500 ссылок, все ок работает (подумаем чуток и работает)

я понимаю, что он думает пока создает очередь запросов, но почему валится при большом кол-ве ссылок?

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

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


Бывалый
*


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

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



подозреваю что нужно как-то работать с $kernel->yield( $event, @event_args );
НО тогда не могу понять как перехватывать my ( $heap, $request_packet, $response_packet ) = @_[ HEAP, ARG0, ARG1 ];
вот эти два аргумента ARG0, ARG1

$_[ARG0] уже не пашет
$_[0] тоже не пашет

есть идеи?
PM MAIL   Вверх
DooZ
Дата 20.12.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



неужели никто не работал с POE ?
PM MAIL   Вверх
Ramirez
Дата 20.12.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Похоже так. Я вот тут тоже задавал вопрос - и тишина smile Доков на русском тоже особенно нет...
PM ICQ   Вверх
nitr
Дата 20.12.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DooZ @  28.11.2006,  19:02 Найти цитируемый пост)
Can't locate Net/DNS/RR/A.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.6/i386-linux-thread-multi /usr/lib/perl5/5.8.6 .) at (eval 64) line 3.что за бредятина?


а почему бредятина? Что говорит? smile Да верно, нет модуля такого-то такого-то smile
а конкретно :
Цитата

package Net::DNS::RR::A;
#
# $Id: A.pm 546 2005-12-16 15:23:03Z olaf $


К POE нет вопросов smile При установке твоего POE::Component::Client::HTTP данный пакетик ставится, но если ручками ставили модули, то могли и забыть. Попробуй обновить модуль... а по мне так просто определённая ссылка попадается smile, вот может и валится, хотя такого не встречал. 

З.Ы.: Проверил твой код с 1211 ссылками работает smile

Уточни - задача твоего скрипта?

Добавлено @ 23:04 
Может подскажу smile


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


Бывалый
*


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

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



Цитата(nitr @ 20.12.2006,  23:03)
Цитата(DooZ @  28.11.2006,  19:02 Найти цитируемый пост)
Can't locate Net/DNS/RR/A.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.6/i386-linux-thread-multi /usr/lib/perl5/5.8.6 .) at (eval 64) line 3.что за бредятина?


а почему бредятина? Что говорит? smile Да верно, нет модуля такого-то такого-то smile
а конкретно :
Цитата

package Net::DNS::RR::A;
#
# $Id: A.pm 546 2005-12-16 15:23:03Z olaf $


К POE нет вопросов smile При установке твоего POE::Component::Client::HTTP данный пакетик ставится, но если ручками ставили модули, то могли и забыть. Попробуй обновить модуль... а по мне так просто определённая ссылка попадается smile, вот может и валится, хотя такого не встречал. 

З.Ы.: Проверил твой код с 1211 ссылками работает smile

Уточни - задача твоего скрипта?

Добавлено @ 23:04 
Может подскажу smile

ты попробуй поставить например 20.000 ссылок или поболее
валится или нет?
на 1000 ссылках быстро обработал (загнал к себе в память?)
PM MAIL   Вверх
nitr
Дата 23.12.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DooZ @  22.12.2006,  11:22 Найти цитируемый пост)
ы попробуй поставить например 20.000 ссылок или поболеевалится или нет?на 1000 ссылках быстро обработал (загнал к себе в память?)

Не валится (13778ссылок), но работает небыстро smile я не могу выбрать те ссылки, с которыми коннект замечательный =)
Выложи в инете список с большим количеством ссылок smile 


--------------------
PM   Вверх
nitr
Дата 23.12.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



проверил скрипт на 
Цитата

c:\>3.pl
49980
c:\>

скрипт считает количество ссылок smile
Скрипт с твоми кодом "не отвалился"!
Код твой рабочий, но требует оптимизации, не надо провоцировать людей, конкретно спрашивать smile
Да - он "загоняет" это всё в ОЗУ (281 504Кб)


--------------------
PM   Вверх
DooZ
Дата 27.12.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



видимо косяк в модулях действительно
буду искать =)
сенькс
PM MAIL   Вверх
DooZ
Дата 29.12.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



возник новый вопрос:
для начала сенькс всем кто учавствовал и учавствует в теме, разобрался дело было в модуле

вот есть массив с большим кол-вом ссылок скажем 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});
}

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

заранее сенькс
PM MAIL   Вверх
DooZ
Дата 2.1.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



есть идеи?
PM MAIL   Вверх
DooZ
Дата 22.1.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


Опытный
**


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

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



так ты @url из файла наверное наполняешь? так не гони все это в память. в цикле чтения и запускай обработчиков.
PM ICQ   Вверх
Nab
Дата 1.3.2007, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну что разобрался? Или так и пытаешься все в цикле сделать?

Просто я вот решил изучить POE переписывая свой проксичекер с форков на POE, и выяснил много интересного. А так как строил на тех же примерах, что и у тебя используются, могу подсказать где косяк у тебя smile

У меня другая немного проблема, потому как я всеже не по ссылкам лажу, хотя это тоже предстоит, я проверяю один адрес, но через разные прокси, соответственно большую нагрузку могу создать, поэтому ограничиваю свой поток запросов. Но все одно, через некоторое время стабильно 500 ошибка smile типа я заддосил этот урл smile


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


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


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

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



А шо воно такоэ?
PM MAIL ICQ Skype   Вверх
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   Вверх
nitr
Дата 1.4.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ramirez, отличное предложение smile , только чтобы следили, а то тут много топиков "загадили"...

Добавлено через 36 секунд
я имел те, что вынесли как подфорум или подраздел...


--------------------
PM   Вверх
shamber
Дата 1.4.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я тоже поддерживаю данное предложение. Потому как, мне кажется, уже много людей на этом форуме пытаются с poe работать. Это позволило бы обощить опыт smile
PM MAIL Jabber   Вверх
Ramirez
Дата 1.4.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Может попробовать перевести совместно документацию? И дополнить ее своими примерами/опытом.. Если, конечно, желающие есть? Можно было-бы завести Wiki например...

Цитата(Nab @  2.3.2007,  23:47 Найти цитируемый пост)
А вообщето это  фраймворк реализующий невытесняющую многозадачность основанную на событийной модели.


Если я правильно понимаю, то POE в данном случае выполняет роль диспетчера процессов. В вытесняющей многозадачности диспетчер может сам снять процесс по истечении отведенного ему времени. В невытесняющей модели, диспетчер процессов сам не может этого сделать, поэтому процессы сами должны возвращать ему управление как можно чаще, а он только собирает очередь и решает какой процесс вызвать следующим. Практически, это сводится к тому, что мы должны свести к минимуму использование циклов внутри процессов, а все циклы разбить на последовательные вызовы. Да и вообще, почти все вызовы делать через ядро POE. Поправьте меня, если я что-то путаю...

Это сообщение отредактировал(а) Ramirez - 2.4.2007, 01:42
PM ICQ   Вверх
Nab
Дата 2.4.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Ramirez @  1.4.2007,  23:02 Найти цитируемый пост)
Если я правильно понимаю, то POE в данном случае выполняет роль диспетчера процессов. В вытесняющей многозадачности диспетчер может сам снять процесс по истечении отведенного ему времени. В невытесняющей модели, диспетчер процессов сам не может этого сделать, поэтому процессы сами должны возвращать ему управление как можно чаще, а он только собирает очередь и решает какой процесс вызвать следующим. Практически, это сводится к тому, что мы должны свести к минимуму использование циклов внутри процессов, а все циклы разбить на последовательные вызовы. Да и вообще, почти все вызовы делать через ядро POE. Поправьте меня, если я что-то путаю...
 
Вот именно....
Очень хорошо поняли и изложили smile



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


Новичок



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

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



Самое зло - это использовать sleep в POE )))
PM MAIL   Вверх
stan777
Дата 4.4.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(G0rinich @ 4.4.2007,  15:45)
Самое зло - это использовать sleep в POE )))

А что быстрей РОЕ, форки или треды ? ну все естественно на Unix, я так понимаю алгорит паука вездет тотже без цикла типа for(@url){..}  ?
PM MAIL   Вверх
Nab
Дата 5.4.2007, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(stan777 @  4.4.2007,  23:35 Найти цитируемый пост)
А что быстрей РОЕ, форки или треды ? ну все естественно на Unix, я так понимаю алгорит паука вездет тотже без цикла типа for(@url){..}  ?

А эт зависит от того что иммется ввиду по словом "быстрее" smile
Быстрее написать на POE если его конечно знаешь... 
А вот работает у меня быстрее всего на форках, хотя треды я еще не пробовал, но говорят под никсами, они реализованы не лучшим образом :(

Добавлено через 5 минут и 44 секунды
Но я пока POE знаю не очень, но всеже склоняюсь именно к нему, и на нем буду делать все, на форках сложнее, особенно межпроцесовое общение... А POE хорош тем что  имеет компонентную архитектуру, и если делать все по правилам, то наращивать функционал будет много проще...


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


Новичок



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

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



POE сам умеет форкаться когда надо. Вернее в нем есть какой-то механизм форков, но я всегда наблюдал только один процесс.
От форков я отказался. Вернее от того, что там в перле под именем FORK живет. Так как вообще не понял как оно работает ))) Слабоват я тогда был в никсах, а теперь не кайф про это вспоминать ))) Уж лучше руками запустить несколько раз один скрипт, предварительно научив копии не мешать друг другу.
PM MAIL   Вверх
Ramirez
Дата 5.4.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я тут пробовал POE::Component::EasyDBI неблокирующий доступ к базе реализует, так вот он висит отдельным процессом в системе...

Вот, кстати есть такой вопрос. Вот код для примера:
Код

POE::Component::Server::TCP->new(
...
ClientConnected    => \&client_connect,
ClientInput        => \&client_input,
...
);

# -------------------------------------------------------------------
sub client_connect {
    my ( $heap, $message ) = @_[ HEAP, ARG0 ];
    my $session_id = $_[SESSION]->ID;
    $_[KERNEL]->delay('shutdown', 5); # wait 5 secs for auth
}

# -------------------------------------------------------------------
sub client_input {
    my ( $heap, $input ) = @_[ HEAP, ARG0 ];
    $_[KERNEL]->yield( "shutdown" ) if $input eq "exit"; # handle exit
    $_[KERNEL]->delay('shutdown') if $input eq "auth"; # cancel auto-disconnect
    ....
    другие события
}


при подключении клиента, в процедуре client_connect ставится задержка 5 секунд, по истечении которых сессия закрывается.
в процедуре client_input проверяем ввод клиента, и например, если введено слово "auth" отменяем запланированное закрытие сессии.

Так вот бывают ситуации, коннект плохой например, когда в очередь уже встали другие события для этой сессии (через yield), но перед ними стоит событие shutdown, оно естественно происходит, закрывает сессию, а потом приходят следующие события, сессии такой уже нет, и скрипт вываливается :( Мне казалось что POE должен сам такие ситуации корректно обрабатывать. Видимо где-то я логику не улавливаю...

Это сообщение отредактировал(а) Ramirez - 5.4.2007, 09:33
PM ICQ   Вверх
shamber
Дата 5.4.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Так ты же сделай просто $heap->flag. проверяй его и если он не выставлен например, то функция отрабатывает, а если выставлен то выход. Я так подобные систуации разруливал smile а в POE как мне показалось такой проверки нет.
PM MAIL Jabber   Вверх
stan777
Дата 5.4.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Nab @ 5.4.2007,  01:00)
Цитата(stan777 @  4.4.2007,  23:35 Найти цитируемый пост)
А что быстрей РОЕ, форки или треды ? ну все естественно на Unix, я так понимаю алгорит паука вездет тотже без цикла типа for(@url){..}  ?

А эт зависит от того что иммется ввиду по словом "быстрее" smile
Быстрее написать на POE если его конечно знаешь... 
А вот работает у меня быстрее всего на форках, хотя треды я еще не пробовал, но говорят под никсами, они реализованы не лучшим образом :(

Добавлено @ 01:05
Но я пока POE знаю не очень, но всеже склоняюсь именно к нему, и на нем буду делать все, на форках сложнее, особенно межпроцесовое общение... А POE хорош тем что  имеет компонентную архитектуру, и если делать все по правилам, то наращивать функционал будет много проще...

Я так понял что тут обсуждается таже проблема велосипеда, то есть паука. Да на форках   я тоже хочу написать, вот только как разберусь с IPC::Shareable, мне кажется это быстрей чем через pipe()'ы, хотя риализации, ни на расшареной памяти ни на пайпах у меня нет, хотя вот на тредах работает вроде нормально, это лучший вариант который я имею на сегодняшний день, хотя жрет много памяти 70 тредов 250 мегов, это на FreeBSD 6.1.

Это сообщение отредактировал(а) stan777 - 5.4.2007, 18:06
PM MAIL   Вверх
Ramirez
Дата 16.4.2007, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(shamber @  5.4.2007,  11:22 Найти цитируемый пост)
Так ты же сделай просто $heap->flag. проверяй его и если он не выставлен например, то функция отрабатывает, а если выставлен то выход. Я так подобные систуации разруливал smile а в POE как мне показалось такой проверки нет. 


Нашел кажется smile до use POE надо сказать 

Код

sub POE::Kernel::ASSERT_DEFAULT () { 1 } 


тогда, включится куча проверок (как написано в мане) и в том числе:
Код

ASSERT_EVENTS enables checks for dispatching events to nonexistent sessions.


Вроде помогло....

Это сообщение отредактировал(а) Ramirez - 16.4.2007, 04:22
PM ICQ   Вверх
nagual2
Дата 16.6.2009, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прошло 2 года а пациент все там же ...
Кто то решил данную проблему?
PM MAIL   Вверх
Ramirez
Дата 16.6.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Какую именно? G0rinich привел в треде наиболее академичный пример решения проблемы. 
Nab - наиболее простой для понимания, но с некоторыми нюансами.

Это сообщение отредактировал(а) Ramirez - 16.6.2009, 08:59
PM ICQ   Вверх
nagual2
Дата 17.6.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Ramirez @ 16.6.2009,  08:59)
Какую именно? G0rinich привел в треде наиболее академичный пример решения проблемы. 
Nab - наиболее простой для понимания, но с некоторыми нюансами.

А как приведенные варианты будут работать с 
Код
use POE 0.34;
use POE::XS::Queue::Array;

PM MAIL   Вверх
nagual2
Дата 17.6.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Паука я уже сделал ... там еще патчик есть на poe 
http://groups.google.com/group/perl.poe/br...Cf9263fef5314ea

Еще я хотел fcgi приложение написать на poe но там другая проблема
http://forum.sysfaq.ru/index.php?showtopic...mp;#entry385670
Я писал разработчику 
Код

Hi,

I'm afraid I've kind of left that code for a long time.. Can you try the latest from git (http://code.d.cx/?p=POE-Component-FastCGI.git;a=summary,
git clone git://code.d.cx/POE-Component-FastCGI.git).

I think there's some fixes in there I hadn't got around to releasing..

David

On Tue, Jun 09, 2009 at 12:01:09AM +0300, [email protected] wrote:
> Hi
> ______________________________________________________________________
> ______
> _______
> #!/usr/bin/perl -w
> use strict;

> use HTTP::Request;
> use HTTP::Response;
> use POE::Component::FastCGI;
> POE::Component::FastCGI->new(
>     Address             => '/mnt/md0/test.sock',
>     Unix                => 1,
>     Handlers    => [
>         [ '/' => \&default ],
>         [ '' => \&default ],
>     ],
>     );
> system("chmod 777 /mnt/md0/test.sock"); POE::Kernel->run();

> print "\nAll done\n";
> exit 0;
> sub default {
>     my (    $request )    = @_;
>     my    $response    = $request->make_response;
>     my    $content    = join( "\n",
>         qq{<!DOCTYPE html\n\tPUBLIC "-//W3C//DTD XHTML 1.0 
> Transitional//EN"\n\t 
> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>}, qq{<html 
> xmlns="http://www.w3.org/1999/xhtml"; lang="en-US" xml:lang="en-US">},
>         qq{<head>},
>         qq{<title>Fast CGI Rocks</title>},
>         qq{<meta http-equiv="Content-Type" content="text/html; 
> charset=windows-1251" />},
>         qq{</head>},
>         qq{<body>},
>         qq{<h1>Fast CGI Rocks</h1>Invocation number <b>$COUNTER</b> 
> PID <b>$$</b>.<hr />},
>         '',
>         qq{</body>},
>         qq{</html>},
>         ''
>     );
>     print STDERR "Accept request accept\n";
>     $response->header(
>         "Content-type"        => "text/html; charset=windows-1251",
>         "Content-Length"    => length( $content ),
>     );
>     $response->content( $content );
>     $response->send;
>     $COUNTER++;
>      print STDERR "Response sent\n";
> }
> ______________________________________________________________________
> _
> Nginx.conf
>                 location / {
>                     set $path_info $fastcgi_script_name;
>                     set $real_script_name $fastcgi_script_name;
>                     if ($fastcgi_script_name ~ "(.+?.pl)(/.+)$") {
>                         set $real_script_name $1;
>                         set $path_info $2;
>                     }
>                     fastcgi_param SCRIPT_FILENAME
> $document_root$real_script_name;             #!
>                     fastcgi_param SCRIPT_NAME $real_script_name; #!
>                     fastcgi_pass        unix:/mnt/md0/test.sock;
> #                   include             /usr/local/nginx/conf/phpcgi.conf;
> #                   fastcgi_index       index.cgi;
> #                   fastcgi_param       PATH_TRANSLATED
> $fastcgi_script_name;
>                     fastcgi_param       CONTENT_TYPE
> $content_type;
>                     fastcgi_param       CONTENT_LENGTH
> $content_length;
>                     fastcgi_param       DOCUMENT_ROOT
> $document_root;                 #!
> #                   fastcgi_param       DOCUMENT_URI
> $document_uri;
>                     fastcgi_param       GATEWAY_INTERFACE       CGI/1.1;
> #!
> #                   fastcgi_param       PATH_INFO2
> "http://$http_host$request_uri";
>                     fastcgi_param       QUERY_STRING
> $query_string;
>                     fastcgi_param       REMOTE_ADDR
> $remote_addr;                   #!
>                     fastcgi_param       REMOTE_PORT
> $remote_port;                   #!
>                     fastcgi_param       REQUEST_URI
> $request_uri;                   #!
>                     fastcgi_param       REQUEST_METHOD
> $request_method;                #!
> #                   fastcgi_param       SCRIPT_NAME2
> $fastcgi_script_name;
>                     fastcgi_param       SERVER_ADDR
> $server_addr;                   #!
>                     fastcgi_param       SERVER_NAME
> $server_name;                   #!
>                     fastcgi_param       SERVER_PORT
> $server_port;                   #!
>                     fastcgi_param       SERVER_PROTOCOL
> $server_protocol;               #!
>                     fastcgi_param       SERVER_SOFTWARE
> nginx/$nginx_version;           #!
>                     fastcgi_param       REDIRECT_STATUS 200;
>                 }
> ______________________________________________________________________
> ______
> ______

> Fcgi server not close connection ...
> $req->header(Connection => 'close');  not work ...
> :-(

> _______________________________


Но его код из гиты тоже нерабочий  smile

Добавлено через 4 минуты и 13 секунд
Кстати как зствать poe нагружать все головы проца а не одну ?
PM MAIL   Вверх
Ramirez
Дата 17.6.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



POE всегда испоняется в одном процессе. 
Можно использовать POE::Wheel::Run для запуска чего-либо отдельным подпроцессом. Тогда эти процессы смогут работать на разных ядрах. При этом с созданным процессом сохряняется связь через stdin, stdout, stderr.

так например POE::Component::EasyDBI  работает.

Это сообщение отредактировал(а) Ramirez - 17.6.2009, 16:44
PM ICQ   Вверх
nagual2
Дата 17.7.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А как переделать для многопоточности такое:

Код

use POE::Component::Generic::Net::SSH2;

my $ssh = POE::Component::Generic::Net::SSH2->spawn(
    alias   => 'my-ssh',
    verbose => 1,
    debug   => 0 );

my $channel;

POE::Session->create(
    inline_states => {
        _start => sub {
            $poe_kernel->delay( 'connect', $N );
        },

        connect => sub {
            $ssh->connect( {event=>'connected'}, $HOST, $PORT );
        },

        connected => sub {
           $ssh->auth_password( {event=>'login'}, $USER, $PASSWORD );
        },

        error => sub {
            my( $resp, $code, $name, $error ) = @_[ARG0, $#_];
            die "Error $name ($code) $error";
        },

        login => sub {
            my( $resp, $OK ) = @_[ARG0..$#_];
            unless( $OK ) {
                $ssh->error( {event=>'error', wantarray=>1} );
                return;
            }
            $poe_kernel->yield( 'cmd_do' );
        },
      cmd_do => sub {
            $ssh->cmd( { event=>'cmd_output', wantarray=>1 }, $CMD );
            return;
        },

        cmd_output => sub {
            my( $resp, $stdout, $stderr ) = @_[ARG0..$#_];
            warn "Contents of home directory on $HOST:\n$stdout\n";
            $poe_kernel->yield( 'exec_do' );
        },

        exec_do => sub {
            $ssh->exec( { event=>'exec_running', wantarray=>0 },
                        "cat - >$FILE", ,
                        StdoutEvent => 'exec_stdout',
                        StderrEvent => 'exec_stderr',
                        ClosedEvent => 'exec_closed',
                        ErrorEvent  => 'exec_error'
            );
        },

        exec_running => sub {
            my( $resp, $ch ) = @_[ARG0..$#_];
            # keep channel alive
            $channel = $ch;
            $channel->write( {}, "$$-CONTENTS OF THE FILE\n" );
            $channel->send_eof( {event=>'done'} );
        },

        done => sub {
            undef( $channel );
            $ssh->shutdown;
        },

        exec_error => sub {
            my( $code, $name, $string ) = @_[ARG0..$#_];
            die "ERROR: $name $string";
        },

        exec_stderr => sub {
            my( $text, $bytes ) = @_[ARG0..$#_];
            die "STDERR: $text";
            return;
        },
        exec_stdout => sub {
            my( $text, $bytes ) = @_[ARG0..$#_];
            warn "STDOUT: $text";
            return;
        },

        exec_closed => sub {
            undef( $channel );
            $ssh->shutdown;
        },
    }
);

POE::Kernel->run();



Куда встроить цикл ?

Кстати в use POE qw(Component::Client::Whois); я встроил а в этот незнаю ... пока ...


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


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

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


 




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


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

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