第一次接触协程这个概念是在学习Swoole的时候。当时看官方文档还不能完全理解什么是协程,如何正确使用协程。后来慢慢看了一些写得比较火的文章,有了自己的一些理解,才渐渐开始对协程有了一些了解。认识协程协程不是进程或线程,它们的执行更类似于子例程,或没有返回值的函数调用。上面这句话很关键。一言以蔽之,什么是协程,什么不是协程。下图可以清楚的看出协程和多进程的区别:执行顺序下面的代码主要做了三件事:写文件,发邮件,插入数据。300){returnfalse;//无需写入超过300}echo"Writeto文件{$i}\n";睡眠(3000);returntrue;}functiontask2($i){//使用$i标志发送邮件,约3000微秒if($i>500){returnfalse;//超过500则无需发送}echo"发送邮件{$i}\n";睡眠(3000);returntrue;}functiontask3($i){//使用$i标志插入数据,约3000微秒if($i>100){returnfalse;//不要插入超过100}echo"插入数据{$i}\n";睡眠(3000);返回真;}$i=0;while(true){$task1Result=task1($i);$task2Result=task2($i);$task3Result=task3($i);if($task1Result===false&&$task2Result===false&&$task3Result===false){break;//所有任务完成,退出循环}$i++;}swoole实现协程代码:add();//创建一个煮汤任务(启动一个新协程)Coroutine::create(function()use($wg,&$result){echo"Startcookingsoup...".PHP_EOL;//耗时6分钟煮汤,这样我们就不用在这里等汤煮好了,//直接进入下一个任务:煮饭(协程切换)sleep(8);echo"Thesoupisready...".PHP_EOL;//服务$result['soup']='一锅汤';$wg->done();//标记任务完成});//RecorditCook(记录一个任务)$wg->add();//创建一个烹饪任务(启动一个新的协程)Coroutine::create(function()use($wg,&$result){echo"Startcooking...".PHP_EOL;//烹饪需要5分钟米饭,这样我们就不用在这里等米饭煮熟了,先放一会看看好不好//我们先把汤煮好(协程切换)sleep(10);echo"Therice煮熟了……”.PHP_EOL;//盘子$result['rice']='一锅米饭';$wg->完成();//标记任务完成});//记录烹饪$wg->add();//创建一个炒菜任务(并启动一个新的协程)Coroutine::create(function()use($wg,&$result){//煎鱼的过程必须在一个协程中执行,如果不是的话,鱼可能还没炸好就出锅了。//因为开启协程后,IO都是异步的,在这个demo中,每次遇到sleep,都会挂起当前协程。//切换到nextcoroutineexecution//比如为炒菜这一步启动一个新的协程,那么在炸鱼的时候,鱼就熟了。echo"放油...".PHP_EOL;睡觉(1);echo"炸鱼...".PHP_EOL;睡觉(3);echo"放盐...".PHP_EOL;睡觉(1);回声“出锅了……”。PHP_EOL;//Plate$result['food']='鱼香肉丝';$wg->完成();});//等待所有任务完成$wg->wait();//返回数据(服务!)var_dump($result);});var_dump('总花费时间:'.(time()-$startTime).'分钟');}}$cooker=newCook();$cooker->cookByCo();通过执行代码,我们可以看到协程方式比传统的阻塞方式快了13分钟。从协程方式实现的逻辑可以看出,异步I/O的效果和性能是通过无感知的编写“同步代码”来实现的。避免了传统异步回调带来的代码逻辑离散和陷入多层回调导致的代码不可维护。不过需要注意的是,传统回调的触发条件是回调函数,而协程切换的条件是遇到I/O。协程的误区在实际使用协程时,需要注意以下几个误区,否则效果可能会事倍功半。从理论上讲,协程解决了I/O多路复用的问题,对于计算密集型的问题是无效的。如果cpu很空闲(大部分时间花在网盘上),协程可以提高cpu的利用率。如果cpu本身就很饱和,使用coroutine反而会降低cpu的利用率(做coroutine.scheduling需要时间)。swoole是单线程参考链接swoole学习笔记-做饭看协程协程-EasySwooleswoole协程-swoole精通之路swoole一个协程问题?为什么效率变慢
