Модули Net::*,
использующие
LWP::UserAgent – зло?!
YAPC::Russia 2009
Блиц-доклад
17 мая 2009 г.
YAPC Russia 2008
17 мая 2009 г.
CGI.pm – зло!?
17 мая 2009 г.
Net::* и WWW::*
• Net::LastFM
• Net::LastFM::Submission
• Net::Twitter
• Net::FriendFeed
• WWW::Alexa::TrafficRank
17 мая 2009 г.
Net::* и WWW::*
• Net::LastFM
• Net::LastFM::Submission
• Net::Twitter
• Net::FriendFeed
• WWW::Alexa::TrafficRank
17 мая 2009 г.
Perl interface to the
XXX API
17 мая 2009 г.
use LWP::UserAgent;
17 мая 2009 г.
Net::* и WWW::*
my $submit = Net::LastFM::Submission->new(
. . .,
ua => LWP::UserAgent->new(
agent => 'nls',
timeout => 5,
),
);
my $twitter = Net::Twitter->new(
. . .,
useragent_class => LWP::UserAgent->new(...),
);
my $alexa = WWW::Alexa::Traffic->new(timeout => 5);
17 мая 2009 г.
Все хорошо,
все работает!
17 мая 2009 г.
но...
17 мая 2009 г.
LWP::UserAgent –
блокирующий
17 мая 2009 г.
LWP::UserAgent::POE –
неблокирующий
17 мая 2009 г.
Не решает всех
проблем :)
17 мая 2009 г.
Не решает всех
проблем
• «Связывает» руки
• Невозможно использовать свой POE-клиент
• Хочу AnyEvent, IO::Lambda или что-то свое :)
17 мая 2009 г.
POE::Component::
WWW::Alexa::TrafficRank
non-blocking wrapper
around WWW::Alexa::TrafficRank
17 мая 2009 г.
use POE::Wheel::Run;
Форкается :)
17 мая 2009 г.
Нехорошо
Т. к. нужно выполнить только блокирующий запрос
LWP::UserAgent
17 мая 2009 г.
Что же делать?
17 мая 2009 г.
POE::Component::Twitter
Собственная реализация Twitter API,
не использует Net::Twitter
17 мая 2009 г.
Нехорошо
Т. к. не использует Net::Twitter
Клон!? :)
17 мая 2009 г.
Что же делать?
• Net::LastFM::Submission
• разделить механизм создания запроса и
обработки ответа от посылки запроса и
ожидания ответа
• решает все проблемы
• очень легко!
• гармонично :)
17 мая 2009 г.
Net::LastFM::Submission
• Создание запросов: HTTP::Request
• _request_handshake
• _request_now_playing
• _request_submit
• Обрабокта ответа: HTTP::Response
• _response
17 мая 2009 г.
Не использовать в
этих методах
die / croak / confess
Рекомендация
17 мая 2009 г.
Net::LastFM::Submission
no strict 'refs';
for my $m ('handshake', 'now_playing', 'submit') {
*{$m} = sub {
my $self = shift;
my $r = $self->${\\\"_request_$m\"}(@_);
...
my $data = $self->_response(
$self->{'ua'}->request($r)
);
...
return $data;
};
}
17 мая 2009 г.
POE::Component::
Net::LastFM::Submission
non-blocking wrapper
truelly asynchronously
17 мая 2009 г.
POE::Component::
Net::LastFM::Submission
use POE::Component::Client::HTTP;
также поддерживает возможность использовать
свой POE-клиет
17 мая 2009 г.
POE::Component::
Net::LastFM::Submission
(map {
my $m = $_;
$m => sub {
my $request = $_[HEAP]->{'submit'}
->${\\\"_request_$m\"}($_[ARG1]);
...
$_[KERNEL]->post(
$_[HEAP]->{'client'} => 'request' => 'response',
$request,
);
};
} 'handshake', 'now_playing', 'submit'),
17 мая 2009 г.
Net::LastFM::Submission
P::C::N::LastFM::Submission
http://github.com/sharifulin/net-lastfm-submission
17 мая 2009 г.
Net::LastFM
P::C::Net::LastFM
http://github.com/sharifulin/net-lastfm
17 мая 2009 г.
Модули Net::*,
использующие тупо
LWP::UserAgent – зло!
17 мая 2009 г.
Net::FriendFeed
Каппа, я тебя убедил?
Внесешь изменения в свой модуль? :)
17 мая 2009 г.
use Perl
or die
17 мая 2009 г.
JFDI
17 мая 2009 г.
Спасибо за внимание!
Анатолий Шарифулин
RostovOnDon.pm
17 мая 2009 г.
0 comments
Post a comment