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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по POE (продолжение) 
:(
    Опции темы
nIkTo
Дата 27.11.2009, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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




Вот пример кода который привёл G0rinich в теме Вопрос по POE

Я немогу разобраться : $_[KERNEL] вызыает методы какого модуля, а именно не понятна строка :
Код

my $jobs_cnt = $_[KERNEL]->call('HTTP_CLIENT' => 'pending_requests_count');


Я так понимаю call это метод модуля POE::Component::Client::HTTP, а где мы экспортировали в $_[KERNEL] методы этого модуля чтобы могли вызивать из через $_[KERNEL]  ?

Код

#!/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);
    },
};

PM   Вверх
sir_nuf_nuf
Дата 27.11.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообщем да.
Только не совсем модуля.
POE оперирует понятием компонент. При регистрации компонента в ядре ему можно назначить алиас - имя.
Так вот HTTP_CLIENT - это алиас.

А вы вызываете метод компонента.  Синхронно причем.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
nagual2
  Дата 3.7.2010, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


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

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


 




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


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

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