swoole mysql 协程_关于协程的优点以及swoole 协程的用法
在上篇文章中php yield关键字以及协程的实现 我们讲到了协程的原理以及运行步骤.
现在我们来继续看下协程的执行顺序.
协程的运行是交叉式运行(串行),只要你发起了一次协程切换,则会立马暂停当前协程,去运行下一个协程,直到下次代码调度回协程.
协程的优点
看到上面的执行顺序,你可能还是不能理解协程的优点,这个其实是一个很简单的概念,举个例子:
小明烧开水需要10分钟,刷牙需要3分钟,吃早餐需要5分钟,请问做完这些事情总共需要多少分钟?
答案是10分钟,因为在烧开水这个步骤时,不需要坐在那里看水壶烧(异步,io耗时)可以先去刷牙,然后去吃早餐
协程的优点主要在于这里,当遇上io耗时的情况时,这部分的等待时间我们其实可以节约出来,去先处理其他代码逻辑的,直到io完成再继续执行之前的代码.
没错,协程的优点就在于这个.
swoole协程
在swoole中,已经自带了协程管理器,以及异步io的扩展(redis.mysql,http客户端等),我们只要安装好swoole扩展,就可以直接使用协程了,例如以下代码:$start_time = time();
/*for ($i = 0; $i <= 500; $i++) {
go(function ()use($i,$start_time){
$cli = new Swoole\Coroutine\Http\Client('www.baidu.com', 443,true);
$cli->setHeaders([
'Host' => "www.baidu.com",
"User-Agent" => 'Chrome/49.0.2587.3',
'Accept' => 'text/html,application/xhtml+xml,application/xml',
'Accept-Encoding' => 'gzip',
]);
$cli->set([ 'timeout' => 0.11]);
$cli->get('/');
$cli->close();
echo "协程{$i}已完成,耗时".(time()-$start_time).PHP_EOL;
});
}*/
$start_time = time();
for ($i = 0; $i <= 500; $i++) {
$url = 'https://www.baidu.com/';
$content = file_get_contents($url);
echo "普通{$i}已完成\n";
}
echo "非携程完成时间:" . (time() - $start_time);
在非协程环境,它的执行顺序和执行时间如下:
而在注释掉非协程代码,协程环境运行下,它的执行顺序和时间如下:
为什么会这样呢?我说下具体的流程:
非协程流程
1:先执行$i=0
2:通过file_get_contents获取网页内容
3:获取成功后在进行输出: 普通0已完成
4:继续执行$i=1
...
协程流程
1:先执行$i=0
3:协程切换不等待获取网页内容,直接跳到$i=1
....
n:$i=0的请求内容已经完成,切换回$i=0后面的代码,输出"协程0已完成,耗时0"
n+1:通过异步client类,去请求https://www.baidu.com,协程切换不等待获取网页内容,直接跳到$i=n+2
n+2:$i=n的请求内容已经完成,切换回$i=n后面的代码,输出"协程n已完成,耗时5"
....
由这2个流程可以看出一个不同之处:非协程需要等待请求网页的时间,而协程直接跳过了等待的时间,继续往下执行,
也就是上面说的"小明烧开水的时间先去刷牙"
然后,由于协程没有了io耗时,执行速度大大提高,假设请求一次网站需要0.05秒,那500次循环就相当于节省了25秒,这就是为什么协程适合在高并发io场景的原因了
本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn
swoole mysql 协程_关于协程的优点以及swoole 协程的用法相关推荐
- unity协程_[C#进阶]C#实现类似Unity的协程
使用过Unity的同学一定知道,Unity提供了一套协程机制,简直不要太好用.但是这个协程依赖于Unity引擎,离开Unity就无法使用.那有没有办法实现不依赖Unity的协程呢?答案是当然阔以. 所 ...
- swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池
连接池 open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖 版本 >=7.0.0 >=4.2.9 Recommend ...
- mysql火焰图_火焰图(Flame Graphs)的安装和基本用法
火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原 ...
- swoole mysql 协程_Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比
Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...
- swoole mysql 协程_swoole-orm: 基于swoole的mysql协程连接池,简单封装。实现多个协程间共用同一个协程客户端。参考thinkphp-orm...
swoole-orm 基于swoole的mysql协程连接池,简单封装. 实现多个协程间共用同一个协程客户端 感谢完善 [1]:nowbe -> 新增数据返回insert_id 版本 v0.0. ...
- 查看某个进程的线程在干什么_有了多线程,为什么还要有协程?
早期编程都是基于单进程来进行,随着计算机技术的发展,当下推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标.既然线程可以解决高并发问题,为什么后来人们又搞 ...
- java 协程_你真的了解kotlin的协程么?
协程我的理解是协作的线程,就是说与主线程协作的线程,也就是工作线程. 而协程的本质确实是这样.Kotlin协程的底层就是Java的多线程,协程就是一个比较方便的线程框架.协程这种线程框架有什么好处呢? ...
- c++ 协程_理解Python协程(Coroutine)
由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...
- c++ 协程_用yield实现协程
上一篇 理解python中的yield关键字 介绍了使用yeld实现生成器函数,这一篇我们来继续深入的了解一下yield,用yield实现协程. 先来解答一下上一篇留下的问题:下面的代码为什么第二次调 ...
- python3 携程_多任务(3):协程
代码环境:python3.6 上一篇文章我们讲了 python 中多线程的使用:点击阅读,现在我们讲讲 python 中的协程. 异步IO 我们知道,CPU 速度远远快于磁盘.网络等 IO.在 IO ...
最新文章
- 【LeetCode】230#二叉搜索树中第K小的元素
- cocos2d-x 3.0 Loading界面实现
- SystemCenter2012SP1实践(5)SCVMM管理HyperV
- 学点 C 语言(9): if 语句
- Heap 3214 LIS题解
- P4480-[BJWC2018]餐巾计划问题【三分,贪心】
- Leetcode--162. 寻找峰值
- Linux部署Web应用程序超链接下载中文名称文件404问题解决办法
- XXX数据仓库分析模型设计文档
- 书籍-Java性能调优指南
- 【b站黑马程序员C++视频学习笔记-文件操作】
- 【日常学习——论文写作】毕业论文的查重
- 用计算机弹清明上河图谱,[TIF超清] 《清明上河图》北宋 张择端 单幅画1.85GB全卷扫描...
- UI设计中线性图标设计总结
- Bugku web — ereg正则%00截断(代码审计) ——详细题解
- excel求方差和标准差的函数_Excel计算方差和标准差
- 微信支付宝网站二维码收款个人免签收款接口代搭建
- restful什么意思_RESTful的真正含义是什么?
- el-input 邮箱 身份证号和手机号校验
- R语言学习系列之向量化计算
热门文章
- 机房做隔断为什么要用防火玻璃?
- Python编程语言学习:在for循环中如何同时使用2个变量或者3个变量
- 成功解决ModuleNotFoundError: No module named ‘sklearn.lda‘
- Interview:算法岗位面试—10.12上午—上海某科技公司图像算法岗位(偏图像算法,互联网AI行业)技术面试考点之LoR逻辑回归的底层代码实现、特征图计算公式
- ML之FE:数据处理—特征工程之稀疏特征的简介、如何处理、案例应用之详细攻略
- MQ各个元素的详细理解
- Function、Object、Prototype 之间的关系解析
- 用筛选法求100以内的素数(数组)
- ubuntu卸载vsftpd出错
- __declspec(dllexport)的作用