Предположим, что у меня есть несколько задач в одном приложении, которое может быть завершено в любом порядке. И мне нужно запустить код, когда все задачи будут завершены. Если это имеет значение, приложение работает под AnyEvent, но без Coro.
В некоторой степени AnyEvent $cv->begin/$cv->end
разрешить то, что я хочу. Тем не менее, я хотел бы иметь более мелкомасштабный контроль. Например, я бы не смог дважды завершить задачу. Также было бы полезно собрать данные из всех задач.
Конечно, это можно сделать. Настройте множество обратных вызовов, которые разделяют хэш; удалять ключи из этого хеша всякий раз, когда заканчивается задание; вызовите megacallback, когда хеш пуст. Интересно, есть ли более цивилизованный способ сделать это, может быть, какой-то модуль CPAN?
Например, вот мнимый API, который заполнит мою потребность.
#!/usr/bin/perl -w
use strict;
use Some::Module;
# Set goals
my $cb = Some::Module->new( sub { say 'BOOM!' } );
$cb->begin( qw(foo bar) );
# Much later, as tasks start getting done
$cb->end( foo => 42 ); # "return" value from task 'foo'
$cb->begin( 'baz' ); # can add more tasks, why not
$cb->end( 'bar' ); # just finish task 'bar'
# still waiting for 'baz' to finish at this point
# Finally, last hanging task is done
$cb->end( baz => 137 ); # BOOM!
# at this point, sub {}->( { foo=>42, bar=>undef, baz=>137 } )
# has been called
См. также мой вопрос perlmonks.
Это что-то вроде этого?