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被跳过。
然而,这都是
同步的代码,所以暂时看不出有什么用途。
分享到:
相关推荐
1.什么是协程 2.协程和线程的差异 3.简单的实现协程
本文实例讲述了Python协程 yield与协程greenlet简单用法。分享给大家供大家参考,具体如下: 协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更...
yield 在协程中的用法: 在协程中 yield 通常出现在表达式的右边, 例如: datum=yield,可以产出值, 也可以不产出–如果 yield 关键字后面没有表达式,那么生成器产出 None. 协程可能从调用方接受数据,调用方是...
使用yield实现协程.py
首个基于Swoole原生协程的新时代 PHP 高性能协程全栈框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的PHP-FPM,全异步非阻塞IO实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的...
首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用,没有...
tsf (Tencent Server Framework) 是腾讯公司推出的 PHP 协程方案,基于 Swoole PHP Generator 实现的 Coroutine。Tencent Server Framework 是快速服务器部署框架,PHP 现在可以像 Golang 一样用协程实现高并发...
本文主要给大家介绍了关于PHP中协程和阻塞的理解与思考,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 进程、线程、协程 关于进程、线程、协程,有非常详细和丰富的博客或者学习资源,我不在此...
首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用...
ptask 是 PHP 的协程扩展 使用这个扩展,使得PHP可以像Python和Lua一样使用协程。 安装: $ git clone https://github.com/liexusong/ptask $ cd ptask/libtask $ make $ sudo make install $ cd ../...
在协程中yield通常出现在表达式的右边,例如:datum = yield,可以产出值,也可以不产出–如果yield关键字后面没有表达式,那么生成器产出None. 协程可能从调用方接受数据,调用方是通过send(datum)的方式把数据...
Python对协程的支持还非常有限,用在generator中的yield可以一定程度上实现协程。 yield 传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。 如果改用...
但是有些同学对这个概念似懂非懂,不知道怎么实现,怎么用,用在哪,甚至有些人认为yield就是协程! 我始终相信,如果你无法准确地表达出一个知识点的话,我可以认为你就是不懂。 如果你之前了解过利用PHP实现协程的...
基于 yield 实现了独立堆栈的协程 类似于 Golang 的并发编程模型实现 基于 zan 提供异步非阻塞I/O服务 连接池支持(内置 MySQL、Redis、syslog 等多种组件) 类似 Golang 的 defer 机制解决由于异常导致的资源未...
从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数。可是,在协程中, yield 通常出现在表达式的右边(例如, datum = yield),可以产出值,也可以不产出 —— 如果 yield 关键字后面没有表达式...
tornado协程的理解示例 编写协程函数 from tornado import gen from tornado.httpclient import AsyncHTTPClient @gen.coroutine def coroutine_visit(): http_client = AsyncHTTPClient() response = yield ...
在语句中使用 yield 关键字,则指示在的方案、运算符或 get 访问器是迭代器。下面这篇文章主要给大家介绍了关于Kotlin如何使用类似C#的yield功能的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧
本文实例讲述了Python 协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法。分享给大家供大家参考,具体如下: 实现多任务:进程消耗的资源最大,线程消耗的资源次之,协程消耗的...
主要介绍了python生成器/yield协程/gevent写简单的图片下载器功能,结合实例形式分析了python生成器、yield协程与gevent图片下载器相关功能定义与使用技巧,需要的朋友可以参考下