swoolefy是一个基于swoole的轻量级、高性能的常驻内存API和Web应用服务框架,高度封装了http、websocket、udp服务器,作为以及基于tcp的可扩展rpc服务,还支持composer包安装部署项目。swoolefy基于实用性,抽象出Event事件处理类,实现与底层回调的解耦,支持协程调度、同步|异步调用、全局事件注册、心跳检查、异步任务、多进程(池)等,内置-在视图、日志、会话、mysql、redis、mongodb等常用组件中。目前swoolefy4.2+版本全面支持swoole4.2.13+协程,推荐使用swoole4.3+GitHub:https://github.com/bingcool/s...下面主要讲解如何实现一个go-likewaitGroup函数1.定义GoWaitGroup的类:+------------------------------------------------------------------*/namespaceSwoolefy\Core;useSwoole\Coroutine\Channel;classGoWaitGroup{/***@varint*/private$count=0;/***@varChannel*/private$chan;/***@var数组*/private$result=[];/***WaitGroup构造函数*/publicfunction__construct(){$this->chan=新频道;}/***添加*/publicfunctiongo(\Closure$go_func=null){$this->count++;如果($go_funcinstanceof\Closure){go($go_func);}}/***开始*/publicfunctionstart(){$this->count++;返回$this->计数;}/***完成*/publicfunctiondone(string$key,$data=null){if(!empty($data)){$this->result[$key]=$data;}$this->chan->push(1);}/***wait*/publicfunctionwait(){while($this->count--){$this->chan->pop();}$result=$this->result;$this->result=[];$this->count=0;返回$结果;}}2、在swoolefy中调用classGroupControllerextendsBController{publicfunctionwaitgroup(){//创建一个waitGroup实例$wg=new\Swoolefy\Core\GoWaitGroup();//第一种方式是在$wg->go()函数中直接执行go的协程函数$wg->go(function()use($wg){//挂起协程$fp=stream_socket_client("tcp://www.baidu.com:80",$errno,$errstr,30);//协程返回的数据$wg->done('mysql','mysql');});$wg->go(function()use($wg){sleep(1);$wg->done('腾迅','微信和qq');});//挂起当前协程,待所有任务完成后恢复//$result=$wg->wait();//这里$result包含一个任务执行结果//var_dump($result);//第二种方法,添加$wg->start(),启动Coroutine,然后使用swoole的原生go执行协程函数$wg->start();go(function()use($wg){//暂停协程sleep(1);$wg->done('taobao','alibaba');});//第二种方法,添加$wg->start(),启动协程,然后使用swoole的原生go执行协程函数$wg->start();go(function()use($wg){//暂停协程sleep(1);$wg->done('baidu','baidu');});//上面三个协程会被并发调用,wait()函数会等待三个协程的数据返回//挂起当前协程,放弃对cpu的控制,cpu可以做其他事情直到所有任务完成后恢复$result=$wg->wait();//这里$result包含2个任务执行结果var_dump($result);}}至此最简单的并发调用就完成了,可以愉快的使用gowaitGroup协程调用了
