[Moscow.pm] Простые однотипные операции с AnyEvent
Konstantin S. Uvarin
khedin на mail.ru
Вт Авг 14 10:36:31 PDT 2012
On Thu, 2012-08-09 at 11:13 +0400, Ivan Petrov wrote:
> > Приветствую!
>
> > Время от времени при написании (интеграционных?) тестов чего-то с эниэвентом
> > возникает почти одинаковая портянка:
>
> > my $cv = AnyEvent->condvar;
> > my $tm = AnyEvent->timer( after => 10, cb => sub { $cv->croak("Timeout"); };
> > do_something( sub{ $cv->send(shift); }, sub{ $cv->croak(shift); } );
> > my $result = $cv->recv();
> > undef $tm;
> > analyze_do_something( $result );
>
> > Чешутся руки написать вместо этого
>
> > my $result = ae_recv {
> > do_something( ae_send, ae_croak );
> > } 10; # timeout
> > analyze_do_something( $result );
>
> > Соответственно, вопрос:
> > 1) А есть ли уже такой интерфейс?
> > 2) Нужен ли он кому-то ещё?
>
> если будет соответствующе оформлен, то хороший будет модуль.
> только кроме ae_send, очевидно надо еще обязательно приделать ae_begin
> и ae_end.
>
> потому что очень много групповых тестов, вроде того "делаем 5
> одновременных запросов"
Собственно, написал. Не знаю уж как насчет "соответствующего
оформления", просьба высказать замечания, на той неделе постараюсь их
пофиксить.
https://github.com/dallaylaen/perl-AE-AdHoc
В процессе работы над begin/end подумал, что в сущности end имеет две
точки входа (вызов ae_end и вызов коллбэка), так что можно бы обойтись
без begin, но это ломает сходство с оригинальным AnyEvent, что нам не
нужно.
Кроме того, удобнее, чем счетчик, иметь хеш событий (страховка от дублей
и т.д.).
В связи с этим есть желание добавить ae_goal($id) следующего вида:
* при вызове записывает где-то в хеше "задачу"
* при повторном вызове - сохраняет результат в другом хеше, удаляет
"задачу" и, если задачи кончились, делает send.
Нечто похожее и Mons Anderson описывает в соседней ветке.
--
С уважением, Константин Уварин
jabber:lodin на jabber.ru
+7 (903) 266-26-25
Подробная информация о списке рассылки Moscow-pm