PHP进阶教程-PHP的协程怎么玩?这一篇带你搞定swoole协程
协程是一种特殊函数,是一种可以挂起的函数,然后可以从挂起的地方重新恢复执行,一个线程内的多个协程是串行的,跟CPU处理进程一样,同一时刻只能一个协程在线程上运行,除非出让了控制权给别的协程运行。协程无法利用多核CPU因此协程只能解决并发问题,不能解决任务处理速度问题。协程就是把一个大任务再分成更小的片段,封装程一个函数,当其中一个协程需要IO阻塞的时候,主动挂起当前协程,把控制权交给其他协程运行。 我们知道进程和线程是由操作系统调度的,什么时候执行取决于操作系统什么时候把CPU时间交给某个进程或者线程,而协程是什么时候交出控制权是由用户决定的。进程和线程属于内核态,协程属于用户态线程。 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。 我的 企鹅群 一起交流哦 协程特点
我们知道线程是轻量级的进程,那么协程就是轻量级的线程。协程运行在线程之上,一个线程可以有多个协程。 我们知道在进程遇到阻塞的时候开多一个线程在进程内部切换,避免每次都切换进程,这样可以更大力度的使用CPU分给这个进程的可使用时间。而协程跟线程和进程的关系很类似,只不过协程是跟线程直接建立关系。 上图是多个线程之间切换的示意图,那么我们来考虑一下,如果线程只是等待IO操作(网络或者文件),那么为什么像线程重复使用进程一样来重复的使用这个线程呢?我们把IO去掉,看看这个图是什么样子的。 去掉IO部分操作,可以看出来基本上这个并发请求应用程序代码可以在 单个线程中 运行,协程最大力度的利用了线程等待IO的时间,让程序在等待IO的时候可以执行别的业务代码。 看着像不像一个线程的执行流程,这就是协程的魅力所在,当一个协程被yield之后会被挂起,把控制权转移给线程内部的其他协程,因为是在线程上进行的切换,所以开销远远比进程和线程低很多。 当程序调用协程之后,当前协程会主动让出控制权交给同一个线程内的其他协程处理,如图所示,开发者代码中需要使用IO的时候主动让出协程的控制权给别的协程使用。 去掉IO部分再看协程的处理,直接执行的都是业务逻辑,避免遇到IO导致线程转换到等待状态,更充分的利用CPU分给这个线程的执行时间。
协程由于是建立在线程之上的,因此没有办法使用CPU多核心的优势,协程适合适用于IO密集运算的场景。 协程有什么作用?协程是为了提高CPU使用率,避免在线程阻塞的时候大量的线程上下文切换。
以上代码的CPU使用率仅有 1%
使用协程,成功把CPU使用率提高到了4%,这样CPU就不需要为了IO阻塞而空跑,或者进行上下文切换。之前不是说过协程不能加速吗?这里使用协程之后怎么1秒多就执行完了,跟前面的代码不一样?这里得到的时间取决于最后一个协程执行结束的时间。 协程的执行顺序
先输出:main->go2->go1 协程之间通讯多个协程之间通讯,采用Channel实现,多个协程协助完成共同的任务。
实战:实现waitGroup功能利用Swoole提供的Channel实现一个 waitGroup ,主要功能是用来等待所有协程执行完成的。
代码中:https://www.sunnyos.com/swoole.php swoole.php 的代码
休眠疫苗模拟网络请求耗时 这里看看使用协程3个协程都进行了网络请求,每个请求耗时1秒,但是在这里执行都时候三个请求执行完了仅耗时1.2秒,但是cpu都使用率却使用到了6%,这说明了协程充分的使用了cpu。 点关注,不迷路好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以 点击进入暗号: PHP+「平台」 更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新) 以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |