[心得] Coro + AE

看板Perl作者 (autechre)時間11年前 (2013/08/15 18:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
不確定能不能幫到大家 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; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.171.51.74
文章代碼(AID): #1I3BCSSc (Perl)
文章代碼(AID): #1I3BCSSc (Perl)