async_pool で coro が再利用されているのを確認する
use strict; use warnings; use Coro; for my $i (0..4) { print $i .q{,}. async_pool { print "$i-1\n"; cede; print "$i-2\n"; cede; print "$i-3\n"; }, "\n"; print "main\n"; cede; }
[takeyuki@sunya ~]$ perl a.pl 0,Coro=HASH(0x94f4398) main 0-1 1,Coro=HASH(0x94efef8) main 0-2 1-1 2,Coro=HASH(0x94eb908) main 0-3 1-2 2-1 3,Coro=HASH(0x94f4398) main 1-3 2-2 3-1 4,Coro=HASH(0x94efef8) main 2-3 3-2 4-1
最初、$i が 0 で、メインスレッド (以降 coro-main) において 0 番目の coro (以降、coro-0) が作られる。それが HASH(0x94f4398)。作られただけでまだこの coro は動かない。メインスレッド coro-main が "main" を出力した後 cede して coro-0 に制御が移り、"0-1" が表示される。coro-0 の cede で今度は main-coro に制御が移り、$i が 1 となって 1 番目の coro が生成される。この coro-1 は HASH(0x94efef8)。"main" を表示後 coro-main が cede して coro-0 に移り、coro-0 は "0-2" を表示後 cede、それにより coro-1 に移り "1-1" を表示して cede する。また coro-main に戻り $i が 2 となり coro-2 HASH(0x94eb908) が生成される。"main" 表示 (by coro-main) の後、coro-0 に移るが、coro-0 は "0-3" を表示してブロックを抜ける、すなわち terminate する。これによって coro-0 は再利用可能な状態になる。coro-0 を抜けたので制御は次の coro-1 に移り、coro-1 は "1-2" を表示して cede、coro-2 が "2-0" を表示して cede、coro-main に制御が移る。coro-main は $i が 3 で async_pool するがこのとき新たに coro オブジェクトを生成するのではなく、再利用可能な状態でプールされている HASH(0x94f4398)、かつての coro-0 を返す。
というような感じ。