Не используйте condvars, кроме как для блокировки программы верхнего уровня во время ожидания завершения событий. Использование condvars сильно затрудняет повторное использование кода; любая функция, которая имеет внутренний condvar, никогда не может безопасно использоваться в программе, в которой есть другая функция, в которой есть condvar. (Это неправда, если вы никогда не звоните recv
и используете только cb
. Но все же ... это опасно и не для тех, кто не знает, что делает.)
Мое правило: если имя файла оканчивается .pm
, без условий!
Если вы хотите запустить несколько вещей параллельно и запустить еще один код, как только все результаты станут доступны, попробуйте Event :: Join :
sub delay($$) {
AnyEvent->timer( after => $_[0], cb => $_[1] );
}
my $join = Event::Join->new(
on_completion => sub { say "Everything is done" }
events => [qw/t1 t2 t3/],
);
delay 1, $join->event_sender_for('t1');
delay 2, $join->event_sender_for('t2');
delay 3, $join->event_sender_for('t3');
Затем, через 3 секунды, вы увидите «все сделано». Event :: Join похож на начало и конец на condvars, но никогда не может блокировать вашу программу. Так что легко использовать код, который его использует. Кроме того, события именуются, поэтому вы можете собирать результаты в виде хэша, а не просто вызывать обратный вызов при вызове других обратных вызовов.