perl coro socket编程(2)-客户端coro改造
发布时间:2020-12-16 00:20:11 所属栏目:大数据 来源:网络整理
导读:先从客户端开始改造. 把多进程/线程改写成coro的协程是最自然的思路了. coro本身并不一定要求事件,主要是实现无阻塞. 而client主要是发送,可以认为是无阻塞的,所以也可以不用coro::socket. 但是延时是需要用到事件的 可以对比看看 如果用默认的select或者sle
先从客户端开始改造. 把多进程/线程改写成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 "joiningn"; $_->join; print "joinedn"; }; sub random { # 该函数产生随机字串 my @x=(0..9,'a'..'z','A'..'Z'); join '',map {$x[int rand @x]} 1..49; # 返回49字节长度的串 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |