协程的概念
协程(
Coroutine)又名纤程,是一种用户态的轻量级线程。协程不受内核调度,协程的切换完全由程序自己掌控,操作系统对协程无感知。协程拥有自己的寄存器上下文和栈。协程调度切换时(通常是协程主动让出CPU执行权),将寄存器上下文和栈保存,在切换回来时,再恢复先前保存的寄存器上下文和栈。
php中基于yield关键字的协程
php从5.5版起增加了yield关键字。使用了yield关键字的函数又被成为生成器函数。与return关键字不同的是,yield关键字实际上返回的是一个
生成器对象(Generator class)而非一个值,zend引擎会为这个
生成器对象开辟一块独立的堆栈空间,从而使得每一个生成器对象可以保存自己的状态。
生成器对象每次在收到迭代的指令后,会从之前的中断处即(yield关键字标识的地方)重新执行,直到再次遇到yield关键字,这是便保存自己当前的状态并暂时中断。
下面的代码中,在loop函数里使用了yield关键字,每次调用这个生成器函数时,都会从之前的中断处执行。
<?php
function loop($start, $end, $step = 1) {
for ($i = $start; $i <= $end; $i += $step) {
yield $i;
}
}
$loop = loop(1, 10);
var_dump($loop); // 返回的是一个生成器对象 object(Generator)
var_dump($loop->current()); //获取生成器对象当前的值,输出1
$loop->next();//使生成器对象运行到下一个yield处
var_dump($loop->current()); //输出2