swoole协程的实现原理是什么
发布时间 - 2022-02-14 00:00:00 点击率:次在swoole中,Swoole server接收数据在worker进程触发onReceive回调,产生一个协程,Swoole为每个请求创建对应携程,协程中也能创建子协程,协程在底层实现上是单线程的,因此同一时间只有一个协程在工作。
本教程操作环境:Windows10系统、Swoole4版、DELL G3电脑
swoole协程的实现原理是什么
什么是进程?
进程就是应用程序的启动实例。独立的文件资源,数据资源,内存空间。
什么是线程?

线程属于进程,是程序的执行者。一个进程至少包含一个主线程,也可以有更多的子线程。线程有两种调度策略,一是:分时调度,二是:抢占式调度。
什么是协程?
协程是轻量级线程,协程也是属于线程,协程是在线程里执行的。协程的调度是用户手动切换的,所以又叫用户空间线程。协程的创建、切换、挂起、销毁全部为内存操作,消耗是非常低的。协程的调度策略是:协作式调度。
Swoole 协程的原理
Swoole4 由于是单线程多进程的,同一时间同一个进程只会有一个协程在运行。
Swoole server 接收数据在 worker 进程触发 onReceive 回调,产生一个携程。Swoole 为每个请求创建对应携程。协程中也能创建子协程。
协程在底层实现上是单线程的,因此同一时间只有一个协程在工作,协程的执行是串行的。
因此多任务多协程执行时,一个协程正在运行时,其他协程会停止工作。当前协程执行阻塞 IO 操作时会挂起,底层调度器会进入事件循环。当有 IO 完成事件时,底层调度器恢复事件对应的协程的执行。。所以协程不存在 IO 耗时,非常适合高并发 IO 场景。(如下图)
Swoole 的协程执行流程
协程没有 IO 等待 正常执行 PHP 代码,不会产生执行流程切换
协程遇到 IO 等待 立即将控制权切,待 IO 完成后,重新将执行流切回原来协程切出的点
协程并行协程依次执行,同上一个逻辑
协程嵌套执行流程由外向内逐层进入,直到发生 IO,然后切到外层协程,父协程不会等待子协程结束
协程的执行顺序
先来看看基础的例子:
go(function () {
echo "hello go1 \n";});echo "hello main \n";go(function () {
echo "hello go2 \n";});go() 是 \Co::create() 的缩写, 用来创建一个协程, 接受 callback 作为参数, callback 中的代码, 会在这个新建的协程中执行.
备注: \Swoole\Coroutine 可以简写为 \Co
上面的代码执行结果:
root@b98940b00a9b /v/w/c/p/swoole# php co.phphello go1 hello main hello go2
执行结果和我们平时写代码的顺序, 好像没啥区别. 实际执行过程:
运行此段代码, 系统启动一个新进程
遇到 go(), 当前进程中生成一个协程, 协程中输出 heelo go1, 协程退出
进程继续向下执行代码, 输出 hello main
再生成一个协程, 协程中输出heelo go2, 协程退出
运行此段代码, 系统启动一个新进程. 如果不理解这句话, 你可以使用如下代码:
// co.php执行并使用 ps aux 查看系统中的进程:
root@b98940b00a9b /v/w/c/p/swoole# php co.php &⏎ root@b98940b00a9b /v/w/c/p/swoole# ps auxPID USER TIME COMMAND 1 root 0:00 php -a 10 root 0:00 sh 19 root 0:01 fish 749 root 0:00 php co.php 760 root 0:00 ps aux我们来稍微改一改, 体验协程的调度:
use Co;go(function () { Co::sleep(1); // 只新增了一行代码 echo "hello go1 \n";});echo "hello main \n";go(function () { echo "hello go2 \n";}); \Co::sleep() 函数功能和 sleep() 差不多, 但是它模拟的是 IO等待(IO后面会细讲). 执行的结果如下: root@b98940b00a9b /v/w/c/p/swoole# php co.phphello main hello go2 hello go1怎么不是顺序执行的呢? 实际执行过程:
运行此段代码, 系统启动一个新进程
遇到 go(), 当前进程中生成一个协程
协程中遇到 IO阻塞 (这里是 Co::sleep() 模拟出的 IO等待), 协程让出控制, 进入协程调度队列
进程继续向下执行, 输出 hello main
执行下一个协程, 输出 hello go2
之前的协程准备就绪, 继续执行, 输出 hello go1
到这里, 已经可以看到 swoole 中 协程与进程的关系, 以及 协程的调度, 我们再改一改刚才的程序:
go(function () {
Co::sleep(1);
echo "hello go1 \n";});echo "hello main \n";go(function () {
Co::sleep(1);
echo "hello go2 \n";});我想你已经知道输出是什么样子了:
root@b98940b00a9b /v/w/c/p/swoole# php co.phphello main hello go1 hello go2
推荐学习: swoole教程
# swoole
# 有一
# 携程
# 单线程
# 也能
# 系统启动
# 回调
# 挂起
# 的是
# 我想
# 是在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
如何在腾讯云服务器快速搭建个人网站?
Laravel如何使用模型观察者?(Observer代码示例)
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
怎么用AI帮你为初创公司进行市场定位分析?
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
如何快速完成中国万网建站详细流程?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
nodejs redis 发布订阅机制封装实现方法及实例代码
轻松掌握MySQL函数中的last_insert_id()
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
C++时间戳转换成日期时间的步骤和示例代码
android nfc常用标签读取总结
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
高防服务器如何保障网站安全无虞?
Laravel如何使用Sanctum进行API认证?(SPA实战)
如何在宝塔面板中创建新站点?
如何在IIS中配置站点IP、端口及主机头?
如何快速选择适合个人网站的云服务器配置?
Firefox Developer Edition开发者版本入口
焦点电影公司作品,电影焦点结局是什么?
JS经典正则表达式笔试题汇总
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
重庆市网站制作公司,重庆招聘网站哪个好?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
详解Android——蓝牙技术 带你实现终端间数据传输
如何挑选优质建站一级代理提升网站排名?
Android Socket接口实现即时通讯实例代码
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
在Oracle关闭情况下如何修改spfile的参数
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
php结合redis实现高并发下的抢购、秒杀功能的实例
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
,怎么在广州志愿者网站注册?
C语言设计一个闪闪的圣诞树
如何在搬瓦工VPS快速搭建网站?
做企业网站制作流程,企业网站制作基本流程有哪些?

