coro manager を cancel してみる修行

昨日 coro manager を捕まえることに成功した。ので、これを cancel してみるとどうなるかやってみた。

use strict;
use warnings;
use Coro;

sub ps {
    use Coro::Debug;
    Coro::Debug::command 'ps';
}
sub get_mgr {
    my $mgr;
    async{ print "-pass-\n" }->on_destroy(sub {$mgr = $Coro::current; print "<$mgr>\n";});
    cede;
    return $mgr;
}
ps;
my $mgr = get_mgr;
print $mgr->desc.$mgr."\n";
$mgr->cancel;
ps;
$mgr = get_mgr;

関数 ps で coro の一覧を表示した後、async で作った coro の on_destroy コールバックで coro manager を捕捉。desc メソッドで確認した後 cancel メソッドを読んでみる。また ps で coro の一覧を表示した後、もう一度 coro manager の捕捉を試みる。
実行結果は次のようになった。

                 PID SC  RSS USES Description              Where
           168276692 N-  116    0 [main::]                 -
           168258476 N-  116    0                          -
           168258692 N-  116    0 [coro manager]           -
           168258860 N-  116    0 [unblock_sub scheduler]  -
-pass-
<Coro=HASH(0xa076c84)>
[coro manager]Coro=HASH(0xa076c84)
                 PID SC  RSS USES Description              Where
           168276692 UC  17k    1 [main::]                 [d.pl:5]
           168258860 N-  116    0 [unblock_sub scheduler]  -
           169899220 N-  116    0 [AnyEvent idle process]  -
-pass-

これからわかること。

  • coro manager は cancel で殺せる。
  • coro manager がいなくなっても async や cede は動作する。
  • coro manager がいなくなると on_destroy コールバックが呼ばれないことがある。