Posterous theme by Cory Watilo

Filed under: io::lambda

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