在上篇文章中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 协程的用法相关推荐

  1. unity协程_[C#进阶]C#实现类似Unity的协程

    使用过Unity的同学一定知道,Unity提供了一套协程机制,简直不要太好用.但是这个协程依赖于Unity引擎,离开Unity就无法使用.那有没有办法实现不依赖Unity的协程呢?答案是当然阔以. 所 ...

  2. swoole mysql 连接池_基于Swoole的通用连接池 - 数据库连接池

    连接池 open-smf/connection-pool 是一个基于Swoole的通用连接池,常被用作数据库连接池. 依赖 依赖 版本 >=7.0.0 >=4.2.9 Recommend ...

  3. mysql火焰图_火焰图(Flame Graphs)的安装和基本用法

    火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原 ...

  4. swoole mysql 协程_Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比

    Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...

  5. swoole mysql 协程_swoole-orm: 基于swoole的mysql协程连接池,简单封装。实现多个协程间共用同一个协程客户端。参考thinkphp-orm...

    swoole-orm 基于swoole的mysql协程连接池,简单封装. 实现多个协程间共用同一个协程客户端 感谢完善 [1]:nowbe -> 新增数据返回insert_id 版本 v0.0. ...

  6. 查看某个进程的线程在干什么_有了多线程,为什么还要有协程?

    早期编程都是基于单进程来进行,随着计算机技术的发展,当下推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标.既然线程可以解决高并发问题,为什么后来人们又搞 ...

  7. java 协程_你真的了解kotlin的协程么?

    协程我的理解是协作的线程,就是说与主线程协作的线程,也就是工作线程. 而协程的本质确实是这样.Kotlin协程的底层就是Java的多线程,协程就是一个比较方便的线程框架.协程这种线程框架有什么好处呢? ...

  8. c++ 协程_理解Python协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  9. c++ 协程_用yield实现协程

    上一篇 理解python中的yield关键字 介绍了使用yeld实现生成器函数,这一篇我们来继续深入的了解一下yield,用yield实现协程. 先来解答一下上一篇留下的问题:下面的代码为什么第二次调 ...

  10. python3 携程_多任务(3):协程

    代码环境:python3.6 上一篇文章我们讲了 python 中多线程的使用:点击阅读,现在我们讲讲 python 中的协程. 异步IO 我们知道,CPU 速度远远快于磁盘.网络等 IO.在 IO ...

最新文章

  1. 【LeetCode】230#二叉搜索树中第K小的元素
  2. cocos2d-x 3.0 Loading界面实现
  3. SystemCenter2012SP1实践(5)SCVMM管理HyperV
  4. 学点 C 语言(9): if 语句
  5. Heap 3214 LIS题解
  6. P4480-[BJWC2018]餐巾计划问题【三分,贪心】
  7. Leetcode--162. 寻找峰值
  8. Linux部署Web应用程序超链接下载中文名称文件404问题解决办法
  9. XXX数据仓库分析模型设计文档
  10. 书籍-Java性能调优指南
  11. 【b站黑马程序员C++视频学习笔记-文件操作】
  12. 【日常学习——论文写作】毕业论文的查重
  13. 用计算机弹清明上河图谱,[TIF超清] 《清明上河图》北宋 张择端 单幅画1.85GB全卷扫描...
  14. UI设计中线性图标设计总结
  15. Bugku web — ereg正则%00截断(代码审计) ——详细题解
  16. excel求方差和标准差的函数_Excel计算方差和标准差
  17. 微信支付宝网站二维码收款个人免签收款接口代搭建
  18. restful什么意思_RESTful的真正含义是什么?
  19. el-input 邮箱 身份证号和手机号校验
  20. R语言学习系列之向量化计算

热门文章

  1. 机房做隔断为什么要用防火玻璃?
  2. Python编程语言学习:在for循环中如何同时使用2个变量或者3个变量
  3. 成功解决ModuleNotFoundError: No module named ‘sklearn.lda‘
  4. Interview:算法岗位面试—10.12上午—上海某科技公司图像算法岗位(偏图像算法,互联网AI行业)技术面试考点之LoR逻辑回归的底层代码实现、特征图计算公式
  5. ML之FE:数据处理—特征工程之稀疏特征的简介、如何处理、案例应用之详细攻略
  6. MQ各个元素的详细理解
  7. Function、Object、Prototype 之间的关系解析
  8. 用筛选法求100以内的素数(数组)
  9. ubuntu卸载vsftpd出错
  10. __declspec(dllexport)的作用