先从客户端开始改造.
把多进程/线程改写成coro的协程是最自然的思路了.
coro本身并不一定要求事件,主要是实现无阻塞.
而client主要是发送,可以认为是无阻塞的,所以也可以不用coro::socket.
但是延时是需要用到事件的
可以对比看看
如果用默认的select或者sleep,整个进程就会阻塞
但是如果使用coro的sleep或者select,就不会(作者说Coro::Select比较慢不知道何解,也没提供不慢的推荐)
#!/bin/env perl #使用coro+iosocket作client use strict; use AnyEvent; use Coro; use Coro::AnyEvent; use IO::Socket; #控制超时用 #如果用默认的select,就会阻塞 use Coro::Select qw(select); my $cocurrent = 3; # 并发数 my @coro; doit() foreach 1..$cocurrent; sub doit{ push @coro,async { # 创建到server的连接socket #这里没有使用无阻塞的socket,发送相对阻塞小 my $sock=IO::Socket::INET->new(PeerAddr => 'localhost',PeerPort => 1234,Proto => 'tcp'); for (1..10) { # 每个协 程里,发送10次数据 print $sock (random() . "\n"); #使用select休眠0.25s select(undef,undef,0.5); #Coro::Select::select(undef,0.5); # 每发送一次,就休眠0.25秒 #或者使用非阻塞的sleep 1s.否则会阻塞 #Coro::AnyEvent::sleep 1; } $sock->close; # 发送完后关闭socket,并退出 return; } } foreach (@coro) { print "joining\n"; $_->join; print "joined\n"; }; sub random { # 该函数产生随机字串 my @x=(0..9,'a'..'z','A'..'Z'); join '',map {$x[int rand @x]} 1..49; # 返回49字节长度的串 }