[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