Posterous theme by Cory Watilo

Filed under: poe

DBD::mysql и асинхронные запросы

Оказывается, в августе в DBD::mysql была добавлена поддержка асинхронной работы в prepare. За что спасибо Робу Хоельцу (Rob Hoelz). Теперь с версии 4.019 можно пользоваться этой фичей.

Пример асинхронной работы с mysql в Perl, используя DBD::mysql и AnyEvent http://hoelz.ro/blog/asynchronous-mysql-queries-in-perl-using-dbdmysql-and-anyevent.

В комментах я увидел, что Рокко Капутто, некогда мной любимый, жив и предлагает свои варианты на POE и Reflex. POE, привет! :-)

Это прекрасно, интересно теперь проверить стабильность работы данного решения.

 

use Perl or die;

 

Perl. AnyEvent::HTTP. Кипалив?

Я был так рад, когда перешел с POE на AnyEvent. Сразу же записал POE в ряды зла (напомню, CGI.pm – зло?!, Модули, использующие LWP::UserAgent – зло?!). Но сегодня я узнал, что AnyEvent::HTTP не поддерживает keep-alive соединения, в коде есть пара обидных комментариев:

# changing these is evilour $MAX_PERSISTENT_PER_HOST = 0;

...

         # limit the number of persistent connections         # keepalive not yet supported         if ($KA_COUNT{$_[1]} < $MAX_PERSISTENT_PER_HOST) {
              $KA_COUNT{$_[1]};
            $state{handle}{ka_count_guard} = AnyEvent::Util::guard {
               --$KA_COUNT{$_[1]}
            };
            $hdr{connection} = "keep-alive";
         } else {
            delete $hdr{connection};
         }  ...

На самом деле, AnyEvent::Handle поддерживает keep-alive, но кому-то было лень это реализовать, а меня теперь банят за большое количество соединений :)
Теперь придется все переписать на POE::Component::Client::HTTP (я, конечно, POE любил, но все-таки POE – зло! :)


ЗЫ: Скоро я расскажу про новое зло :)

ЗЫ2: Только что узнал, что Mojo::Client поддерживает keep-alive соединения, т. к. поддерживает полностью протокол HTTP 1.1.  К черту POE, "Viva la revolution!" :)

ЗЫЗЫЗЫ: Я буду писать в IronMan чаще, держись Say Perl, мои переводы будут нечто))



use Perl or die;

JFDI

Original post http://sharifulin.livejournal.com/55600.html

Perl. POE or not POE

Я довольно быстро стал писать на POE различные простые мультиплексы, даже не смотрю в документацию :)
Так, например, сегодня пришлось написать микро-скрипт, который пробежится по базе твиттер-пользователей и проверит их аватары (многие урлы стали невалидными и Амазон очень красиво говорит 404 в виде XML). Скрипт я написал на POE, хотя знаю все недостатки его и есть опыт работы с AnyEvent, IO::Lambda, даже Coro + Coro::Mysql. Меня устраивает скорость разработки, но с другой стороны я понимаю, что надо от него уходить. Как перестать писать на POE? (свой мультиплекс писать я не буду :)

POE или не POE. Вот в чем вопрос :)

Original post http://sharifulin.livejournal.com/47957.html

Perl. Мультиплекс и AnyEvent::HTTPD

Две недели назад нужно было написать простой (легкий) веб-сервер, решил еще раз сделать выбор между POE, IO::Lambda и AnyEvent.
IO::Lambda -- сразу не заработала, позже выяснилось, что я соединение не закрывал (спасибо автору модуля за техподдержку :)
AnyEvent. Тут я взял AnyEvent::HTTPD (не от Леманна) и поразился, что модуль написан плохо, в реврайт правилах все слеши заменены на _ (ужас :), работа с тсп по нескольким модулям размазана и работает только под 5.10 (причем использованы только именнованные значения в регекспах, даже say и given нет :). За 10 минут я полностью переписал на 5.8. Заработало, но как-то не очень.
В итоге я написал на POE, решение получилось красивым, хоть по скорости пое проигрывает (немного), но достойной замены  я еще не нашел.

Вернусь к AnyEvent:HTTPD, сегодня вышел апдейт модуля и в ченже вот, что написано:

 
0.04 Sun Dec 28 15:48:28 CET 2008        - removed TCP* classes and using AnyEvent::Handle instead.        - added size and maxlength args to the C<entry> function in Appgets        - changed the API to actually call the events for all path segments          of an URL. also removed the ugly '/' => '_' mapping for the path          seperators. Sorry for any breakage in your code ;-/        - removed Perl 5.10 dependency.

ААА, он сам понял все или я управляю людьми на расстояние  :-)
 

Original post http://sharifulin.livejournal.com/41330.html

Perl. IO::Lambda

IO::Lambda версии 0.41 -- нет слов, просто супер: асинхронный DBI, очередь задач, форки и треды, самое интересное в eg/*.
[info]mcfist, очень круто, респект тебе :)


Бенчмарк tcp:

Lambda using select
0.688 sec

real        0m0.736s
user        0m0.696s
sys        0m0.036s
Lambda using AnyEvent
0.685 sec

real        0m0.737s
user        0m0.676s
sys        0m0.060s
Raw sockets using select
0.145 sec

real        0m0.181s
user        0m0.144s
sys        0m0.036s
POE using select
5.748 sec

real        0m5.863s
user        0m4.988s
sys        0m0.440s

DBI:

sub usage
{
        print <
Test implementation of non-blocking DBI. This script can work in several modes,
run with one of the parameters to switch:

   $0 thread      - use DBI calls in a separate thread
   $0 fork        - use DBI calls in a separate process
   $0 remote HOST - connect to host to port $port and request DBI there
   $0 listen      - listen on port $port, execute incoming connections
        
USAGE
        exit;
}

Скажу честно, на YAPC::Russia 2008 "May Perl"; я узнал про IO::Lambda, но тогда лямбда не впечатлила меня.
Затем пошла цепная реакция -- я услышал, что Алекс Капранов ([info]quappa) использует IO::Lambda для отправки почты, и решил более внимательно посмотреть на лямбду. Как раз подвернулась подходящая задача -- сбор данных с алексы. Я сравнил POE, AnyEvent и IO::Lambda по удобству и красоте написания, написал 3 варианта. Мне понравился AnyEvent (тогда я нашел маленький баг в дистрибутиве). Хотя на чистом аниевенте невозможно расписать некоторые задачи (спасибо за наводку Павлу Кудинову [info]pavel_kudinov), как я сейчас понимаю AnyEvent + Coro это может решить (см. презентацию Евгения Торопова с South Perl). И вот сегодня я обнаружил новую мощную версию IO::Lambda, опубликованную в мой день рождения -- 17 ноября. Теперь я не только на IO::Lambda буду смотреть, но и использовать (и рекламировать :).

Что нужно еще IO::Lambda для полного счастья? Доступ к BDB или Memcached или асинхронный клиент MySQL ? :)


Original post http://sharifulin.livejournal.com/39174.html

Perl. POE. HTTP-клиент

На CPAN появилось пара врапперов над POE::Component::Client::HTTP.

1. HTTP::Client::Parallel A HTTP client that fetchs all URIs in parallel

2. LWP::UserAgent::POE Drop-in LWP::UserAgent replacement in POE environments

Оба модуля сводят к минимуму усилия по написанию HTTP-клиента, но очень сильно связывают руки и не "фонтан".

Странно, почему до сих пор не появилось альтернатив самому PoCo::Client::HTTP, он медленный и имеет ряд багов.

Релиза от [info]pavel_kudinov мы уже точно не дождемся, а мне самому лень писать, задач таковых нет, по мелочи - чистого PoCo::Client::HTTP хватает + AnyEvent::HTTP есть, ну и IO::Lambda :)
Original post http://sharifulin.livejournal.com/33388.html

Perl. POE и DBI

Многих интересует возможность работы с БД (DBI) из POE.
Существует несколько вариантов:
  1. Использовать DBI в текущем процессе, т.е. события, содержащие запросы к БД, будут блокирующими. Такой вариант бывает очень удобным, например, можно забыть про блокировки, полностью и целиком положиться на БД.
  2. Запускать DBI в дочернем процессе, общаться через STDIN/STDOUT/STDERR. Решение не блокирующее.

  3. Я реально использовал только SimpleDBI
    .
  4. Сегодня появилась третья возможность в POE - через пул тредов - POE::Component::Pool::DBI.
Интерфейс компоненты аля Client::HTTP, т.е. просим выполнить что-то с какими-то параметрами и вернуться в определенное событие. Меня порадовал данный модуль, при первой же возможности проверю работоспособность. Сам уже решил попробовать PoCo::Pool::Thread взамен POE::Wheel::Run, но задачи подходящей нет.

For fun - дистрибутив содержит всего лишь один тест, который ничего не тестирует, называется просто -  no_tests_dont_email_me.t :)


Original post http://sharifulin.livejournal.com/30135.html

Perl. Событийная машина и BDB

Только сегодня подумал, что POE не хватает клиента для работы с BerkleyDB или BDB.
И сегодня в новинках CPAN нахожу, что появился модуль AnyEvent::BDB - вот это то, что надо :)
Все больше начинаю смотреть в сторону AnyEvent, я до сих пор под впечатлением от бенчмарка.
Original post http://sharifulin.livejournal.com/25178.html