协程的介绍
协程是什么?
A coroutine is a function that can suspend its execution (yield) until the given given YieldInstruction finishes.
简单的说协程是寄宿在线程下程序员实现的一种跟更轻量的并发的协作轻量线程
随着程序员人群的增大,大佬也不断的爆发式增长,当然就开始有人觉得线程不好用了,那怎么办呢?当然是基于线程的理念上再去实现一套更加轻量、更好骗star的一套轻量线程(事实上协程不能完全被认为线程,因为一个线程可以有多个协程)
协程和线程的区别
本质
线程 内核态
协程 用户态
调度方式
线程的调度方式为系统调度,常用的调度策略有分时调度、抢占调度。说白就是线程的调度完全不受自己控制
协程的调度方式为协作式调度 不受内核控制由自由策略调度切换等等
协作式调度?
上述说了协程是用户态的,所以所谓的协作式调度直接可以理解为是程序员写的调度方式,也就是我想怎么调度就怎么调度,而不用通过系统内核被调度。
深入浅出理解swoole的协程
既然打算浅入理解的swoole的协程,我们必须要知道swoole的协程模型。
swoole的协程是基于单线程。可以理解为协程的切换是串行的,再同一个时间点只运行一个协程.
说到这里,肯定就有人问了。go呢,go的协程的是基于多线程。当然各有各的好处,具体可以自行使用搜索引擎了解
我们可以直接copy & paste 下面代码,再本地的环境进行的 demo run
<?php
$func = function ($index, $isCorotunine = true) {
$isCorotunine && SwooleCoroutine::sleep(2);
echo "index:" . $index . ", value:" . (++$count) . PHP_EOL;
echo "is corotunine:" . intval($isCorotunine) . PHP_EOL;
};
$func(1, false);
go($func, 2, true);
go($func, 3, true);
go($func, 4, true);
go($func, 5, true);
go($func, 6, true);
$func(7, false);
会得到以下结果
index:1, value:1
is corotunine:0
index:7, value:2
is corotunine:0
index:2, value:3
is corotunine:1
index:6, value:4
is corotunine:1
index:5, value:5
is corotunine:1
index:4, value:6
is corotunine:1
index:3, value:7
is corotunine:1
肯定有小伙伴会想,哇塞,尽然1秒都执行完了,一点都不堵塞啊!!
好了,事实上关于1秒执行完的事情可以回过头再去看下协程的概念。
我们可以关注的是执行顺序,1和7是非协程的执行能立马返回结果符合预期。
关于协程的调度顺序
为什么是26543不是65432或者23456有序的返回呢
为了找到我们的答案,我们只能通过源码进行知晓一些东西
分析源码
如果没有较强的基础还有啃烂的apcu的前提下
我们需要关心的是以下两个yield 一个是协程的让出CPUresume 恢复协程