不確定能不能幫到大家
Coro + AE需要注意幾個事…
1. 原本的AE loop會由一個Coro去進行
2. 而原本的AE loop 以外的Coro若die,會導致整個程式exit
今天終於找到除了在Coro裡包eval以外的解法
基本上就是在SIG{__DIE__}處理,若這個Coro是使用者自己用async{}生出來的,就放到
陣列裡記住,並coro::terminate避免程式離開,而如果不是使用者產生的,就不跑coro::
terminate (這是問到作者Marc Lehmann生氣後得到的答案 XDrz )
另外要注意處理eval的情況($^S)
package CoroPatch;
use Coro;
#use Data::Dumper;
our @thrs,$__DIE__;
$Coro::State::DIEHOOK = sub{
return if $^S;
warn ">>>",@_;
$__DIE__->(@_) if ref $__DIE__ eq "CODE";
# warn "Coro::current: ",$Coro::current,"\n";
# warn Dumper(\@thrs);
for my $t(@thrs){
if($Coro::current == $t){
warn "terminate coro...\n";
@thrs = grep{$_ != $t} @thrs;
$t->terminate;
last;
}
}
};
sub AEasync(&@){
# print "AEasync..\n";
my($cb,@param) = @_;
Coro::async{
push @thrs,$Coro::current;
$cb->(@_);
},@param;
}
sub import{
shift @_;
$__DIE__ = {@_}->{__DIE__} || sub{};
*main::async = \&AEasync;
}
1;