coro学习-击鼓传花

coro学习-击鼓传花这个是协程的经典例子 之前有一篇 erlang 和 stackless 比较的文章有详细介绍 用 perl 的 coro 实现了一下 程序没有很好地优化架构 不过便于阅读 usr bin env perl coro 测试程序 testcoro11 pl perl 版的击鼓传花 erlang 和 stackless 的经典例子

大家好,我是讯享网,很高兴认识大家。

这个是协程的经典例子。

之前有一篇erlang和stackless比较的文章有详细介绍。


讯享网

用perl的coro实现了一下。

程序没有很好地优化架构,不过便于阅读。

#!/usr/bin/env perl #coro测试程序testcoro11.pl #perl版的击鼓传花(erlang和stackless的经典例子) #由n个节点组成一个环状网络,在上面传送共m个消息。 #将每个消息(共m个),逐个发送给1号节点。 #第1到n-1号节点在接收到消息后,都转发给下一号节点。 #第n号节点每次收到消息后,不再继续转发。 #当m个消息都从1号逐个到达第n号节点时,认为全部处理结束。 #每次执行时设定n=300,m=10000 use strict; use Coro; my $n=$ARGV[0]; if(not defined $n){ $n=300; }; my $m=$ARGV[1]; if(not defined $m){ $m=10000; } #创建channel my @ch; foreach my $i (1..$n){ $ch[$i]= new Coro::Channel; } #用于结束 my $result=new Coro::Channel; #创建节点(协程) my @coro; foreach my $i (1..$n){ push @coro , async { #$Coro::current->{desc} = $i; #给协程起个名字 while () { my $msg = $ch[$i]->get; # read msg &Debug("node $i got msg $msg.\n",0); if($i == $n){ &Debug("msg $msg reached last node $i.\n",0); if($msg == $m){ &Debug("final msg send back.\n",0); $result->put ($msg); } }else{ &Debug("node $i passed msg $msg to next node.\n",0); $ch[$i+1]->put ($msg); } #if($msg >= $m){ # last; #} } } } #初始化消息 foreach my $j (1..$m){ $ch[1]->put ($j); &Debug("send msg $j to node 1.\n",0); } #等待结束消息 my $msg=$result->get; &Debug("received final msg $msg.\n",1); sub Debug($$) { my ($msg,$dlvl)=@_; my $DEBUGLVL=1; if(not defined $dlvl){ $dlvl=0; } if($dlvl >= $DEBUGLVL ){#只显示大于显示界别的调试信息 print $msg; } return 0; } 

讯享网实际测试结果,在注释掉Debug函数调用的情况下,相比erlang和stackless还是有不小的差距的。
讯享网#-bash-3.00$ time ./tcoro12_ring.pl 30000 100 #received final msg 100. # #real    0m31.085s #user    0m30.965s #sys     0m0.118s #-bash-3.00$ time ./tcoro12_ring.pl 100 30000 #received final msg 30000. # #real    0m29.439s #user    0m29.418s #sys     0m0.019s #-bash-3.00$

                    
小讯
上一篇 2025-04-07 17:37
下一篇 2025-01-19 19:42

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/62171.html