11.1号本课程针对swoole做了一次升级,将swoole2.x升级到swoole4.4.8,关于本节小伙伴和我反馈本节没太理解,那么我想通过写这篇文章的方式来帮助其他困惑的小伙伴,或者仔细看 6-17 节协程化redis一些问题的思考这一节, 希望对大家有帮助,也欢迎大家留言
我先贴下课程代码 a.php
go(function () { // s1 co::sleep(1); // s2 //sleep(1); // s3 echo "协程1".PHP_EOL; // s7 }); echo "singwa swoole".PHP_EOL; // S4 Swoole\Coroutine::create(function () { // s5 echo "协程2".PHP_EOL; // s6 });
我们知道当我们PHP执行a.php的时候,这个时候系统开启了一个进程, 然后程序执行到 上图 s1的时候,我们得进程会开一个协程, 这个协程当走到s2的时候 ,因为co::sleep这个其实是堵塞的,并且这个是一个协程sleep, 那么他会交出协程控制权,那么你就可以理解这个协程会让出他的调度权,然后就暂时先不执行本协程下面的代码,在这个过程我们可以得出一个结论: 协程 客户端遇到 堵塞IO的时候 会交出本次调度权给其他协程,从而实现了协程非堵塞IO (达到了非堵塞IO的效果), 然后进程继续走到s4 输出内容, 再走到s1让出的协程控制权交给的s5, s5协程最终输出 协程2
从而输出 :
singwa swoole
协程2
协程1
当我们得程序开启了 sleep
go(function () { // s1 //co::sleep(1); // s2 sleep(1); // s3 echo "协程1".PHP_EOL; // s7 }); echo "singwa swoole".PHP_EOL; // S4 Swoole\Coroutine::create(function () { // s5 echo "协程2".PHP_EOL; // s6 });
同样的道理进程先开启一个协程s1 , 然后走到s3的sleep ,因为sleep是堵塞的,并且不是协程client, 这个堵塞IO 必须等他执行完毕之后方可执行下面,因为他不会交出协程控制权,他没有这个魄力或者说能力,所以他循序执行
输出:
协程1
singwa swoole
协程2
所以从上面我们可以看出协程可以减少IO堵塞从而提升性能
备注:本章会有 小15个视频内容更新,下周会陆续发布,请小伙伴耐心等待!