金利0無利息キャッシング – キャッシングできます

 | 

2009-05-22

Coroのscheduleからの戻り方

21:31 | Coroのscheduleからの戻り方 - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - Coroのscheduleからの戻り方 - 金利0無利息キャッシング – キャッシングできます

Coroのscheduleを実行した後どうやって戻ってくるんだファック!みたいになったときに。

ソース

use strict;
use warnings;

use Coro;
use Coro::EV;

my $wakeme = $Coro::current;
warn $wakeme->desc; # [main::]

my $loop_exit = 0;
async {
    warn "loop start";
    EV::loop while (!$loop_exit);
};
async { warn "async main" };

sub hoge {
    my $a = "local value";
    async {
        warn "async hoge $a";
        $loop_exit = 1;
    };
    return "hoge";
}

$Coro::idle = sub {
    warn "idle";
    $wakeme->ready;
};

warn hoge;
schedule;
warn "exit success";
  • 戻って来たい場所を$wakemeに保存しておく。
    • メインは $Coro::main で参照出来るので、それでも良い。
  • 1. $loop_exitが真になるまでEV::loop でループを回すコルーチン
  • 2. async mainとwarnするコルーチン
  • 3. async hogeとwarnするコルーチン、サブルーチンhoge内で定義しても問題ない。ローカル変数を覚えている。
  • $Coro::idleを定義。することが無くなったら$Coro::idleが呼ばれる。
  • hoge()を呼び出す。3のコルーチンが作られて実行待ち。
  • scheduleは「$Coro::current以外で」「実行可能な」コルーチンを探して実行する。1,2,3の順に実行される。
  • $Coro::idle内で $wakeme->ready してやる。メインループが「実行可能な」状態になる。
  • 戻ってくる。終了。

結果

:!perl coro-test.pl
[main::] at coro-test.pl line 8.
hoge at coro-test.pl line 31.
loop start at coro-test.pl line 12.
async main at coro-test.pl line 15.
async hoge local value at coro-test.pl line 20.
idle at coro-test.pl line 27.
exit success at coro-test.pl line 33.
トラックバック - http://subtech.g.hatena.ne.jp/mala/20090522
 |