楼主:
autechre (autechre)
2013-08-15 18:53:13不确定能不能帮到大家
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;