10

1 つのアプリケーションに、任意の順序で終了する可能性のある多数のタスクがあるとします。すべてのタスクが完了したら、いくつかのコードを実行する必要があります。それが重要な場合、アプリケーションは AnyEvent の下で実行されていますが、Coro はありません。

ある程度、AnyEventは私が$cv->begin/$cv->end望むものを許可します。とはいえ、もっと細かく制御したい。たとえば、タスクを 2 回「終了」できないようにしたいと考えています。すべてのタスクからデータを収集する機能も優れています。

もちろん、これは可能です。ハッシュを共有する多数のコールバックを設定します。タスクが終了するたびに、そのハッシュからキーを削除します。ハッシュが空のときにメガコールバックを呼び出します。それを行うためのより文明的な方法があるのだろうか、おそらく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 questionも参照してください。

このようなものがありますか?

4

2 に答える 2