swoole源码学习——协程的概念,yield协程和原生协程的实现(上)

协程的概念协程( Coroutine)又名纤程,是一种用户态的轻量级线程。协程不受内核调度,协程的切换完全由程序自己掌控,操作系统对协程无感知。协程拥有自己的寄存器上下文和栈。协程调度切换时(通常是协程主动让出CPU执行权),将寄存器上下文和栈保存,在切换回来时,再恢复先前保存的寄存器上下文和栈。php中基于yield关键字的协程php从5.5版起增加了yield关键字
摘要由CSDN通过智能技术生成
协程的概念
协程( 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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值