AnyEventはじめました(2)

beginとend

beingとendはセットで使います。beginで呼び出された回数分だけ、endを実行するとイベントループを抜けたい処理を書く場合はこれを使います。

AnyEventの内部にカウンタがセットされていて、それを++するのがbegin(),--するのがendだと思えば良いと思います。

ちなみに$cv->sendを実行すれば、$cv->beginを何回実行していてもすぐに終了します。

サンプルコード

package main;
use strict;
use warnings;
use AnyEvent::Impl::Perl;
use AnyEvent;

my $interval = 3;

my $cv = AnyEvent->condvar;

my $w1;
$w1 = AnyEvent->idle(
    cb => sub {
        print "オラ";
    }
);

my $w2;
$w2 = AnyEvent->timer(
    after => 3,
    interval => $interval,
    cb   => sub {
            $cv->end();
        }
);

my $w3;
$w3 = AnyEvent->signal(
    signal => 'INT',
    cb   => sub {
            print "\n\n$interval 秒、追加ッ!!\n\n";
            $cv->begin();
    },
);

print "僕のッ\n";
print "気が済むまでッ\n";
print "殴るのをやめないッ\n";

sleep(1);

$cv->begin();
$cv->recv;

Ctrl+cを押してシグナルを送信すると$cv->beginが実行されます。

その結果、$cv->endを余計に実行しないとイベントループを抜けないようになりました。

イベントループを抜けるタイミングをコントロールしたい場合に使えるかもしれません。