php协议 302跳转(PHP进阶教程-PHP的协程怎么玩?这一篇带你搞定swoole协程)

feifei123 发布于 2025-02-26 阅读(4)

php100视频教程百度云

协程说复杂不复杂说难也不难,一句话可以概括:能提高并发,但不能加速任务,同步代码实现异步IO,异步非阻塞的代码块协程是一种特殊函数,是一种可以挂起的函数,然后可以从挂起的地方游戏重新恢复执行,一个线程内的多个协程是串行的,跟CPU处理进程一样,同一时刻只能一个协程在线程上运行,除非出让了控制权给别的协程运行。

协程无法利用多核CPU因此协程只能解决并发问题,不能解决任务处理速度游戏问题协程就是把一个大任务再分成更小的片段,封装程一个函数,当其中一个协程需要IO阻塞的时候,主动挂起当前协程,把控制权交给其他协程运行。

我们知道进程和线程是由操作系统调度的,什么时候执行取决于操作系统游戏什么时候把CPU时间交给某个进程或者线程,而协程是什么时候交出控制权是由用户决定的进程和线程属于内核态,协程属于用户态线程协程是一种用户态的轻量级线程,协程的调度完全由用户控制。

协程拥有自己的寄存器上游戏下文和栈协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

我的 企游戏鹅群 一起交流哦协程特点用户态线程、遇到IO主动让出控制权多个协程代码依然是串行的,无需加锁开销低,只占用内存,不存在进程、线程切换开销并发量大,单个进程可开启50w个协程随时随地,只要想并发,就调用游戏go创建协程

我们知道线程是轻量级的进程,那么协程就是轻量级的线程协程运行在线程之上,一个线程可以有多个协程我们知道在进程遇到阻塞的时候开多一个线程在进程内部切换,避免每次都切换进程,这样可以更大力度的游戏使用CPU分给这个进程的可使用时间。

而协程跟线程和进程的关系很类似,只不过协程是跟线程直接建立关系

上图是多个线程之间切换的示意图,那么我们来考虑一下,如果线程只是等待IO操作(网络或者文件),那么为什游戏么像线程重复使用进程一样来重复的使用这个线程呢?我们把IO去掉,看看这个图是什么样子的。

去掉IO部分操作,可以看出来基本上这个并发请求应用程序代码可以在 单个线程中 运行,协程最大力度的利用了线程等待游戏IO的时间,让程序在等待IO的时候可以执行别的业务代码。

看着像不像一个线程的执行流程,这就是协程的魅力所在,当一个协程被yield之后会被挂起,把控制权转移给线程内部的其他协程,因为是在线程上进行的切游戏换,所以开销远远比进程和线程低很多。

当程序调用协程之后,当前协程会主动让出控制权交给同一个线程内的其他协程处理,如图所示,开发者代码中需要使用IO的时候主动让出协程的控制权给别的协程使用。

去掉IO部分游戏再看协程的处理,直接执行的都是业务逻辑,避免遇到IO导致线程转换到等待状态,更充分的利用CPU分给这个线程的执行时间注意:协程并不能让任务加速进行,只能执行更多任务协程由于是建立在线程之上的,因此没有游戏办法使用CPU多核心的优势,协程适合适用于IO密集运算的场景。

协程有什么作用?协程是为了提高CPU使用率,避免在线程阻塞的时候大量的线程上下文切换echo "1-start\n"; s游戏leep(1); echo "1-end\n"; echo "2-start\n"; sleep(1); echo "2-end\n";游戏 echo "3-start\n"; sleep(1); echo "3-end\n"; echo "4-start\n"; 游戏 sleep(1); echo "4-end\n";。

以上代码的CPU使用率仅有 1%Swoole\Runtime::enableCoroutine(true); 游戏go(function () { echo "go1-start\n"; sleep(1); echo "go1-end\n"; });游戏 go(function () { echo "go2-start\n"; sleep(1); echo "go2-end\n"; 游戏 }); go(function () { echo "go3-start\n"; sleep(1); echo "go3-e游戏nd\n"; }); go(function () { echo "go4-start\n"; sleep(1); ec游戏ho "go4-end\n"; });

使用协程,成功把CPU使用率提高到了4%,这样CPU就不需要为了IO阻塞而空跑,或者进行上下文切换之前不是说过协程不能加速吗?这里使用协程之后怎么游戏1秒多就执行完了,跟前面的代码不一样?这里得到的时间取决于最后一个协程执行结束的时间。

协程的执行顺序Swoole\Runtime::enableCoroutine(true); go(游戏function(){ sleep(2); echo "go1\n"; }); go(function(){ sleep游戏(1); echo "go2\n"; }); echo "main\n";

先输出:main->go2->go1协程之间通讯多个协程之间通讯,采用Chan游戏nel实现,多个协程协助完成共同的任务Swoole\Runtime::enableCoroutine(true); $chan = new Swoole\Coroutine\Chann游戏el(); go(function () use ($chan){ sleep(1); $chan->push([name=>sunny]); 游戏 }); go(function() use ($chan){ $data = $chan->pop(); print_r($data); 游戏 }); echo "结束\n";。

实战:实现waitGroup功能利用Swoole提供的Channel实现一个 waitGroup ,主要功能是用来等待所有协程执行完成的c游戏han = new Swoole\Coroutine\Channel(); } public function add(){ $this->count游戏++; } public function done(){ $this->chan->push(true); } pu游戏blic function wait(){ for($i=0;$icount;$i++){ $this->chan->pop(); } 游戏} } add(); go(function() use ($t,&$wg){ echo file_get_contents("ht游戏tps://www.sunnyos.com/swoole.php"); echo "协程1:".(microtime(true)-$t).PHP_EOL; $wg->d游戏one(); }); $wg->add(); go(function() use ($t,&$wg){ echo file_get_co游戏ntents("https://www.sunnyos.com/swoole.php"); echo "协程2:".(microtime(true)-$t).PHP_EOL; 游戏 $wg->done(); }); $wg->add(); go(function() use ($t,&$wg){ echo f游戏ile_get_contents("https://www.sunnyos.com/swoole.php"); echo "协程3:".(microtime(true)-$t).PHP游戏_EOL; $wg->done(); }); $wg->wait(); echo 全部结束:.(microtime(true)-$t).游戏PHP_EOL; }); echo "end".PHP_EOL; echo microtime(true)-$t.PHP_EOL;。

代码中:https:游戏//www.sunnyos.com/swoole.php swoole.php 的代码

标签:  资源网 线程 游戏 个协 进程 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。