内容简介:swoolefy是一个基于swoole实现的轻量级高性能的常驻内存型的API和Web应用服务框架, 高度封装了http,websocket,udp服务器,以及基于tcp实现可扩展的rpc服务, 同时支持composer包方式安装部署项目。基于实用,swoolefy抽象Event事件处理类, 实现与底层的回调的解耦,支持协程调度,同步|异步调用,全局事件注册,心跳检查,异步任务,多进程(池)等, 内置view、log、session、mysql、redis、mongodb等常用组件等。目前swoolefy4.
swoolefy是一个基于swoole实现的轻量级高性能的常驻内存型的API和Web应用服务框架, 高度封装了http,websocket,udp服务器,以及基于tcp实现可扩展的rpc服务, 同时支持composer包方式安装部署项目。基于实用,swoolefy抽象Event事件处理类, 实现与底层的回调的解耦,支持协程调度,同步|异步调用,全局事件注册,心跳检查,异步任务,多进程(池)等, 内置view、log、session、 mysql 、 redis 、 mongodb 等常用组件等。
目前swoolefy4.2+版本完全支持swoole4.2.13+的协程,推荐使用swoole4.3+
GitHub: https://github.com/bingcool/s...
下面主要讲解一下如何实现了类似 go 的waitGroup的功能
1、定义GoWaitGroup的类:
<?php /** +---------------------------------------------------------------------- | swoolefy framework bases on swoole extension development, we can use it easily! +---------------------------------------------------------------------- | Licensed ( https://opensource.org/licenses/MIT ) +---------------------------------------------------------------------- | Author: bingcool <bingcoolhuang@gmail.com || 2437667702@qq.com> +---------------------------------------------------------------------- */ namespace Swoolefy\Core; use Swoole\Coroutine\Channel; class GoWaitGroup { /** * @var int */ private $count = 0; /** * @var Channel */ private $chan; /** * @var array */ private $result = []; /** * WaitGroup constructor */ public function __construct() { $this->chan = new Channel; } /** * add */ public function go(\Closure $go_func = null) { $this->count++; if($go_func instanceof \Closure) { go($go_func); } } /** * start */ public function start() { $this->count++; return $this->count; } /** * done */ public function done(string $key, $data = null) { if(!empty($data)) { $this->result[$key] = $data; } $this->chan->push(1); } /** * wait */ public function wait() { while($this->count--) { $this->chan->pop(); } $result = $this->result; $this->result = []; $this->count = 0; return $result; } }
2、在swoolefy中调用
class GroupController extends BController { public function waitgroup() { // 创建一个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('tengxun', 'weixin and qq'); }); //挂起当前协程,等待所有任务完成后恢复 //$result = $wg->wait(); //这里 $result 包含了 1 个任务执行结果 //var_dump($result); //第二种方式,添加$wg->start(),启动协程,然后使用swoole的原生go执行协程函数 $wg->start(); go(function () use ($wg) { // 挂起协程 sleep(1); $wg->done('taobao', 'ali baba'); }); //第二种方式,添加$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的协程调用了
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Java多线程并发:进程调度算法
- Go 并发编程:Goroutine 如何调度的?
- GO 中的调度:第三部分 - 并发
- Golang 并发问题(五)goroutine 的调度及抢占
- Goroutine 并发调度模型深入之实现一个协程池
- Golang实现简单爬虫框架(4)——队列实现并发任务调度
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与算法分析
维斯 / 人民邮电 / 2006-10 / 59.00元
《数据结构与算法分析:C++描述》秉承Weiss著全一贯的严谨风格,同时又突出了实践。书中充分应用了现代C++语言特性,透彻地讲述了数据结构的原理和应用,不仅使学生具备算法分析能力,能够开发高效的程序,而且让学生掌握良好的程序设计技巧。一起来看看 《数据结构与算法分析》 这本书的介绍吧!