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 コールバックが呼ばれないことがある。