2011-08-12 11 views
0

私はEvent varウォッチャーを使用して内部キューを実装しています。プロデューサスレッドが何かをキュー(配列のみ)に追加すると、監視対象変数の値が変更され、要素が追加されたことを知らせます。イベントvar watcherに相当するAnyEvent?

AnyEventでどうすればいいですか?可変視聴をサポートしていないようです。パイプを使用してIOウォッチャーを使用する必要がありますか(つまり、プロデューサは要素を追加したときにパイプの一端にバイトを書き込みます)

Coroでこれを行う方法を知りたいと思います。

+0

あなたのキューを単純なオブジェクト、おそらくAnyEvent :: Condvarサブクラスにする必要があるようです。キューに追加された各要素に対してbeginを呼び出し、それを処理し、同じcondvarでendを呼び出します。 – MkV

+1

In Coro Coro :: Channelを使用し、$ channel-> getでリスニング側をループし、$ channel-> putで送信側に送る – MkV

+1

変数を監視する必要がある場合は、変数を結びつけたり、 Variable :: Magicで待ちます – MkV

答えて

0

は、私が使用するパラダイムを考え出し:

my @queue; 
my $queue_watcher; 

sub add_item { 
    push(@queue, $_[0]); 
    $queue_watcher ||= AnyEvent->timer(after => 0, cb => \&process_queue); 
} 

sub process_queue { 
    ... # remove zero or more elements from @queue 
    if (@queue) { 
    $queue_watcher = AnyEvent->timer(after => 0, cb => \&process_queue); 
    } else { 
    undef $queue_watcher; 
    } 
} 

と場合にのみ@queueが空でない場合は基本的に$queue_watcherが定義され、アクティブにされています。

0

消費者にコントロールを戻す手段として可変視聴を使用しているかのように聞こえます。 AnyEventでは、プロデューサから$ cv-> send()を呼び出し、コンシューマで$ cv-> recv()を呼び出すことで、これを条件変数で行うことができます。それ以外の場合はキューに入れたい項目をsend()することも考えられますが、パラメータなしでsendを呼び出すことは、消費者に通知するための許可された方法です。

+0

しかし 'AnyEvent'のドキュメンテーションからは、「条件を一度だけ待つことができます - 追加の呼び出しは有効ですが、すぐに戻ります。私のプロデューサーは、単一のアイテムだけでなく、アイテムのストリームを生成します。 – ErikR

+0

次に、$ cv-> beginと$ cv-> endメソッドを探しています。これはペアになっていて、beginでカスタムコールバックを設定し、最後にコールされます(これに対して新しいcondvarsを作成できます)。 – MkV

+0

しかし、私はそれらが生産されているように要素を処理したい。 – ErikR

関連する問題