[Moscow.pm] AnyEvent condvar - reuse not possible?

Maxim monk на nuked.su
Ср Ноя 20 09:25:11 PST 2013


Судя по наличию в синопсисе к AnyEvent строки 

$w->send; # wake up current and all future recv's

это фича.

С точки зрения стилистики программизма на АЕ было бы правильнее писать
тот же функционал (последовательное выполнение двух действий) примерно
так:

use AnyEvent;

my $cv = AE::cv;

my ($t1, $t2);
$t1 = AE::timer 1, 0, sub {
  warn "1st timer fired";
  undef $t1;
  $t2= AE::timer (1, 0, sub {
    undef $t2;
    warn "2nd timer fired";
    $cv->send;
  });
};

$cv->recv;

Или, во избежание вложенности, так

use AnyEvent;

my $cv = AE::cv;

my ($t1, $t2);
my $fired2; $fired2=sub {
  undef $t2;
  warn "2nd timer fired";
  $cv->send;
};
my $fired1;$fired1= sub {
  warn "1st timer fired";
  undef $t1;
  $t2= AE::timer 1, 0, $fired2;
};

$t1 = AE::timer 1, 0, $fired1;

$cv->recv;


On Wed, 2013-11-20 at 20:13 +0400, Anton Yuzhaninov wrote:
> Хочется иметь condvar, которую можно использовать повторно, но похоже $cv->recv 
> можно сделать только один раз.
> 
> В таком коде:
> 
> use AnyEvent;
> 
> my $cv = AE::cv;
> 
> $cv->begin;
> 
> my $t1 = AE::timer 4, 0, sub { $cv->end };
> 
> warn "wait for 1st timer";
> 
> $cv->recv;
> 
> warn "1st timer fired";
> 
> $cv->begin;
> 
> my $t2 = AE::timer 3, 0, sub { $cv->end };
> 
> $cv->recv;
> 
> Второй $cv->recv возвращается сразу без ожидания $cv->end в callback от второго 
> таймера.
> 
> Это баг или фича?



Подробная информация о списке рассылки Moscow-pm