Вот пример кода который привёл G0rinich в теме http://forum.vingrad.ru/forum/topic-124167/hl/%25D0%25B2%25D0%25BE%25D0%25BF%25D1%2580%25D0%25BE%25D1%2581++%25D0%25BF%25D0%25BE++poe/index.html#
Я немогу разобраться : $_[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); }, };
|
|