`
xieye
  • 浏览: 838729 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

php协程关键词yield学习

    博客分类:
  • PHP
阅读更多
php5.5新增了yield,实际是一个创建器的语法。

相关介绍很多,这里看代码
    function fun1($action){
        while(1){
            $num2 = rand(1000,9999);
            $stored = $action->send( $num2 ) ;
            echo "[fun1:{$stored} ]<br>";
            if($stored ==5){
                break;
            }
        }
    }

    function fun2(){
        $r=0;
        while(1){
            $num=(yield $r);
            echo $num."<br>";
            $r++;
        }
    }
    
    $gen = fun2();
    $fun1($gen);
    


结果展示
6593
[fun1:1 ]
1600
[fun1:2 ]
7428
[fun1:3 ]
6764
[fun1:4 ]
3670
[fun1:5 ]


fun2()得到一个创建器对象。
创建器对象可以象数组一样迭代取值,但这里使用了send语法。
send语法可以在两个函数之间互相传参,这里fun1把随机数传给fun2显示,fun2把次数返回给fun1,这就是创建器的巧妙之处。

解释一下流程:
$num2执行完,执行send语句。
进入fun2,send语句会寻找当前的yield,并执行之,然后在下个yield返回,这里的关键点就是会跳过第一个yield,在第2次yield返回。这就是要点。
所以,从send返回时,$r++已执行过一次,然后在yield返回当前的$r,就是1
所以显示fun1:1
再次执行send时,创建器从上次的断点继续执行,send语句是赋值语句,然后就是2.
一直执行下去。


要点1:
yield即可以返回,又可以被外部的send命令赋值,然后传给等号左边的变量,换句话说,他本身也是表达式,他的值就是外部send的传来值。
要点2:
send语法会找到当前的yield,并在下一个yield返回,或创建器的函数末尾返回。所以看起来第一个yield被跳过。

然而,这都是同步的代码,所以暂时看不出有什么用途。


0
1
分享到:
评论

相关推荐

    AH-Toby#PythonAdvanced#3.协程-yield1

    1.什么是协程 2.协程和线程的差异 3.简单的实现协程

    Python协程 yield与协程greenlet简单用法示例

    本文实例讲述了Python协程 yield与协程greenlet简单用法。分享给大家供大家参考,具体如下: 协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更...

    Swoole2.0原生协程高性能开发实践

    在PHP中,Swoole2.0提供了对原生协程的支持,其中yield关键字的使用是实现协程的关键技术。文档中多次提及yield,它被用来在函数中暂停和恢复执行,这正是协程实现非阻塞I/O的核心。 文档中提到了“PHP高可用应用层...

    使用yield实现协程.py

    使用yield实现协程.py

    python协程.pptx

    协程的核心在于 `yield` 关键字,它使得函数能够暂停执行并保存状态,之后可以从暂停的地方继续。协程在语法上与生成器相似,但它们的交互方式有所不同。 在生成器中,`yield` 通常用于产出值,而协程则可以接收和...

    PHP的协程扩展ptask.zip

    ptask 是 PHP 的协程扩展 使用这个扩展,使得PHP可以像Python和Lua一样使用协程。 安装: $ git clone https://github.com/liexusong/ptask $ cd ptask/libtask $ make $ sudo make install $ cd ../...

    Unity3d协程实现

    Unity3D是一款强大的跨平台游戏开发引擎,而协程(Coroutine)是Unity中一个非常重要的概念,它允许...在深入学习时,可以参考提供的博客链接和其他在线资源,以及通过分析`Assets`中的脚本来实践和巩固协程的用法。

    七、协程 自己学习PPT

    生成器在函数内部使用`yield`语句,使得函数能够暂停并返回一个值,当再次调用该函数时,可以从上次暂停的地方继续执行。生成器可以作为消费者和生产者模型的基础,实现非阻塞的并发执行。 然而,仅使用生成器来...

    基于Swoole原生协程新时代PHP高性能协程全栈框架,内置协程网络服务器及常用协程客户端,常驻内存,不依赖传统的PHP-FPM

    首个基于Swoole原生协程的新时代 PHP 高性能协程全栈框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的PHP-FPM,全异步非阻塞IO实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的...

    Unity协程(Coroutine)原理深入剖析

    当协程的`IEnumerator`返回(通常是因为`yield return null`或`yield return`一个已完成的任务)时,协程就会结束。如果在协程运行过程中调用了`StopCoroutine()`,则会立即停止协程。 7. **资源管理**: 协程在...

    基于协程和swoole驱动的高性能PHP框架TSF.zip

    tsf (Tencent Server Framework) 是腾讯公司推出的 PHP 协程方案,基于 Swoole PHP Generator 实现的 Coroutine。Tencent Server Framework 是快速服务器部署框架,PHP 现在可以像 Golang 一样用协程实现高并发...

    关于PHP中协程和阻塞的一些理解与思考

    本文主要给大家介绍了关于PHP中协程和阻塞的理解与思考,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 进程、线程、协程 关于进程、线程、协程,有非常详细和丰富的博客或者学习资源,我不在此...

    Delphi中协程Coroutines的使用实例

    在编程世界里,协程(Coroutines)是一种轻量级的并发执行机制,它们比传统的线程更加灵活,且开销更低。...通过学习和实践,我们可以将协程的优势充分应用到日常的软件开发中,提升程序的性能和用户体验。

    基于Swoole的PHP高性能协程全栈框架设计源码

    内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的PHP-FPM,全异步非阻塞IO实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的异步回调,没有繁琐的yield。它提供了类似Go语言的协程、...

    tornado协程示例

    协程函数通常包含`yield`关键字,用于挂起和恢复协程的状态。 #### 二、编写协程函数 下面通过一个简单的示例来展示如何在Tornado中编写协程函数: ```python from tornado import gen from tornado.httpclient ...

    python协程说明文档

    例如,使用协程计算移动平均值时,调用next(ag)函数后,协程会向前执行到yield表达式,产出average变量的初始值——None。然后,使用send()激活协程,把发送的值赋给num,并计算出avg的值。最后,使用print打印出...

    swoft首个基于Swoole原生协程的新时代PHP高性能协程全栈组件化框架

    首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用...

Global site tag (gtag.js) - Google Analytics