假设我在一个应用程序中有许多任务可以按任何顺序完成。当所有任务完成后,我需要运行一些代码。如果这很重要,应用程序在 AnyEvent 下运行,但没有 Coro。
在某种程度上,AnyEvent$cv->begin/$cv->end
允许我想要的。但是,我希望有更细粒度的控制。例如,我希望不能两次“完成”一项任务。从所有任务中收集数据的能力也很好。
当然,这是可以做到的。设置许多共享哈希的回调;每当任务完成时从该哈希中删除键;当 hash 为空时调用 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 问题。
它有这样的东西吗?