千家信息网

swoole协程的执行流程是什么

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,今天小编给大家分享一下swoole协程的执行流程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一
千家信息网最后更新 2024年11月27日swoole协程的执行流程是什么

今天小编给大家分享一下swoole协程的执行流程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

在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 go1hello mainhello 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 mainhello go2hello 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 mainhello go1hello go2

以上就是"swoole协程的执行流程是什么"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

进程 线程 调度 代码 输出 流程 系统 运行 底层 知识 篇文章 事件 数据 时间 程序 结果 顺序 携程 切换 工作 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 财务服务器主机和家用主机区别 云计算云服务器云部署 金山区网络安全审计系统咨询价格 从事嵌入式软件开发的出路 主域服务器离线后辅助域成为主域 信息网络安全与管理专业就业 超市购物系统设计数据库源代码 大一计算机网络技术试题 昆明医科大学数据库 珠海凶宅数据库 网络安全和监督的主管部 服务器nacos自动关闭 计算机网络技术涉及物理吗 大兴区正规软件开发 qq邮箱服务器怎么弄 快手刷粉丝软件开发 西安佰匠聚心网络技术 中国电信公司网络安全宣传活动 山东千金互联网科技有限公司 如何把家里的电脑做成网站服务器 游戏软件开发项目 网络安全与个人 ldm层在数据库中的用法 git软件开发实战豆瓣 北京科技产业互联网有哪些 8系列数据库访问 树莓派3搭建nas服务器 sql数据库开发报表 王小川互联网科技有限公司 嘉兴打造智慧医院软件开发
0