之前这个组合怎么也搞不定,主要还是对coro的概念有些不清楚.
时隔半年,重新写了一版,居然就顺利通过了.回过头看,其实和当初的错误版本几乎都看不出区别.(就是多了use Coro;一行)
可谓失败和成功只有一线之隔.再次吐槽作者,给个完整的例子不行啊.
要点,AE的事件循环仍然保留,用于监听.
每个连接起一个协程,在coro内部用无阻塞handle读取.
这个就和coro::socket+coro::handle是基本一样的,
#!/bin/env perl
#使用anyevent:socket和coro::handle改造(ok)
use warnings;
use strict;
use Time::HiRes qw(time);
use Coro;
use AnyEvent;
use AnyEvent::Impl::Perl;
use AnyEvent::Socket;
use Coro::Handle;
my $port = 11212;
my @coro;
my $cv = AnyEvent->condvar;
tcp_server undef, $port, sub {
my ($s) = @_
or die "tcp_server: $!";
$cv->begin;
&doit($s); };
$cv->recv;
sub doit($){
#my ($fh)=@_;
my ($nh)=@_;
my $fh = unblock + $nh;
push @coro, async {
$fh->autoflush(1);
my $line="";
my $buf="";
while(my $line=$fh->read($buf,32)){
print $fh->fileno, " ", $line, " ";
$fh->print($line);
}
print "no more data, close socket " . $fh->fileno . "\n";
$fh->close;
#关闭协程
#$cv->end; #退出server
}
}