PHP yield

概念:

        Generator:带 yield的function

        yield:Generator或task的中断关键字,执行到yield时一次调度周期执行完即阻塞,并返回右侧表达式结果,等待下一次调度器运行next()或迭代遍历才会继续往下执行,直至Generator所有迭代或yield语句全部执行完毕

        valid():返回bool值,表示Generator是否未完成,即是否有yield等待执行,(若是Generator创建之后第一次执行此方法,则会从Generator内开始处到第一次yield出现的地方,相当于rewind() 一次)

        current():返回Generator当前值,即yield右侧表达式的值,并且会 执行 上一次yield到本次yield之间的部分(若是Generator创建之后第一次执行此方法,则会从Generator内开始处到第一次yield出现的地方,相当于rewind() 一次)

        rewind():重置Generator状态回到最开始状态,即第一个yield 执行前

        next():执行一次yield之后的代码直到下一次yield停止,yield 下边的代码不会执行 (若是Generator创建之后第一次执行此方法,则会从Generator内开始处到第一次yield出现的地方,相当于rewind() 一次,然后再往第一个yield下面继续执行一次,直到遇到第二个yield停止)

        yield from:后边跟普通数组,或者跟一个Generator 组成嵌套生成器结构,不希望去手动调用Generator的current(),那么在Generator前 使用 yield from 交给上游(框架)来解决。

        send(data):发送data到generator内部,generator接受数据data后,完成 yield->data的替换,并继续从当前中断的yield处往下再执行一次迭代,直到遇到下一次yield(当前执行的是generator的最后一次yield时,会直接完成generator所有迭代,此时valid()返回false)

function A(){echo 'In A before of loop'.PHP_EOL;for($i=0;$i<2;$i++){echo 'In A in loop up'.PHP_EOL;yield;echo 'In A in loop down'.PHP_EOL;}echo 'In A after of loop'.PHP_EOL;
}
$a = A();
// var_dump($a->valid());
// var_dump($a->current());
$a->next();
// $a->next();
// var_dump($a->current());
// $a->valid();
// $a->valid();
// $i = 0;
// while(true){
// 	if($a->valid()){
// 		$i++;
// 		echo '第 '.$i.' 次执行next()';
// 		$a->next();
// 	}else{
// 		break;
// 	}
// }
echo PHP_EOL.'All done'.PHP_EOL;

        yield from:后面跟一个数组,创建一个临时Generator实例,每次迭代时依次返回数组的每个元素

//yield from
function test()
{yield from [1, 3, 5, 7];
}$a = test();
var_dump($a->current());
$a->next();
var_dump($a->current());

//通过使用php yield + 异步非阻塞select()单线程发送多个socket请求并统一获取返回结果,大佬写的示例代码:

PHP Generator Yield Demo: PHP 生成器 yield 语法Demo

//异步非阻塞,yield实现的事件循环统一监听多个socket请求状态的例子:

小白要生发icon-default.png?t=N7T8https://segmentfault.com/a/1190000022979052

yield事件监听实现 promise::All()的意义:

  1. 用同步的代码,发起异步请求,多个请求可并发,从IO串行等待,改为并行等待,减少无畏的等待时间。提高业务程序的效率同时,不降低代码可读性。
  2. 在一个线程内通过事件循环,尽可能处理多个请求,缓解了一个请求一个线程带来的频繁线程切换,从核心上提高运行效率。

promise::All() 核心代码:

/*** all()返回的是一个generator,外面的事件循环监听到任意一个 promise状态变更都会调用此 * generator的send()方法,从事件监听到的数据传入到此generator内部*/
public static function all(...$promises){$re = array();foreach ($promises as $promise){//此处yield将会被send()传递的数据代替,作为promise状态结构收集数组中的一员保存起来,//当所有promise的结构都是完成状态后,此循环中的所有yield即迭代完成,即完成异步多个事件的结果收集,返回结果$re[] = yield;}/*** @var Promise $promise*/$promise = null;foreach ($promises as $promise) {foreach ($re as $param) {//由于promise的收集结果不是按原始顺序排列,而是谁先收到数据谁向结果中写入,此//处需要使用特殊标记 streamName 来作promise和对应结果的匹配和关联,并返回给外//部一个最终结果if ($param['streamName'] == $promise->getStreamName()) {$results[] = $param['data'];}}}return $results;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/168307.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023-10-23 LeetCode每日一题(老人的数目)

2023-10-23每日一题 一、题目编号 2678. 老人的数目二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息&#xff0c;信息用长度为 15 的字符串表示&#xff0c;表示方式如下&#xff1a; 前十…

rust学习——泛型 (Generics)

文章目录 泛型 Generics泛型详解结构体中使用泛型枚举中使用泛型方法中使用泛型为具体的泛型类型实现方法 const 泛型&#xff08;Rust 1.51 版本引入的重要特性&#xff09;const 泛型表达式 泛型的性能 泛型 Generics Go 语言在 2022 年&#xff0c;就要正式引入泛型&#xf…

mysql下载和安装,使用

先下载安装 官方下载 已下载备份软件 安装&#xff0c;一路下一步设置环境变量 4. 打开一个cmd&#xff0c;输入mysql -u root -p

Spark内核调度

目录 一、DAG &#xff08;1&#xff09;概念 &#xff08;2&#xff09;Job和Action关系 &#xff08;3&#xff09;DAG的宽窄依赖关系和阶段划分 二、Spark内存迭代计算 三、spark的并行度 &#xff08;1&#xff09;并行度设置 &#xff08;2&#xff09;集群中如何规划并…

Visual Studio Code官网下载、vscode下载很慢、vscode下载不了 解决方案

前言 开发界的小伙伴们对于Visual Studio Code开发环境来可以说非常熟悉了&#xff0c;但由于在Visual Studio Code官网的下载速度非常的慢&#xff0c;即便开了代理也是一样的很慢、甚至下载被中断&#xff0c;几乎不能下载。 解决方案 1、在Web浏览器上打开vscode官网&#…

RabbitMQ基础篇 笔记

RabbitMQ 余额支付 同步调用 一步一步的来&#xff0c;支付业务写完后&#xff0c;如果之后加需求&#xff0c;还需要增加代码&#xff0c;不符合开闭原则。 性能上也有问题&#xff0c;openfeign是同步调用&#xff0c;性能太差。 同步调用耦合太多。 同步的优势是可以立…

Android View拖拽startDragAndDrop,Kotlin

Android View拖拽startDragAndDrop&#xff0c;Kotlin import android.os.Bundle import android.util.Log import android.view.DragEvent import android.view.View import android.view.View.OnDragListener import android.view.View.OnLongClickListener import android.w…

C语言之排序

1.冒泡排序 冒泡排序就不多说了&#xff0c;只需要两层循环嵌套&#xff0c;两两比较确定相对正确的顺序即可。 2.插入排序 插入排序的思想就是每一次向后寻找一个再将其与前面有序的部分进行对比&#xff0c;寻找合适位置插入。 这里关键要避免让前移超出目前读取的数字&…

高效MMdetection(3.1.0)环境安装和训练自己数据集教程(实现于Linux(ubuntu),可在windows尝试)

一、前言 很久没用mmdetection了&#xff0c;作为目标检测常见的几个深度学习框架&#xff0c;mmdetection用的人还是很多的&#xff0c;其中比较吸引人的一点就是mmdetection集成了非常多的算法&#xff0c;对于想做实验对比和算法学习的人来说&#xff0c;基于这个框架可以事…

寻找二叉树一个节点的后继节点

后继节点&#xff1a;中序遍历的后一个节点 普通二叉树&#xff1a;中序遍历得到一个list&#xff0c;时间复杂度O(n) 本题的二叉树&#xff1a;有父节点的指针&#xff0c;后继节点与原节点的距离为1&#xff0c;因此可以直接通过父节点找到下一个节点 优化&#xff1a;节点…

64 最长公共子序列

最长公共子序列 题解1 DP 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的 最长公共子序列的长度。如果不存在 公共子序列&#xff0c;返回 0 。 一个字符串的子序列是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…

空间地图GIS基础

一、GIS基本概念 地理信息系统&#xff08;Geographic Informaiton System, GIS&#xff09;是一个可以建立、浏览、查询、分析地理空间数据的软件系统&#xff0c;其功能小至地图的展示&#xff0c;大至空间决策分析与支持。 1.GIS基础 (1)地理信息系统(GIS)的概念与组成 …

【Linux系统编程】命令模式2

目录 一&#xff0c;Linux下的初阶认识 1&#xff0c;管道 2&#xff0c;时间戳 二&#xff0c;Liunx系统命令操作 1&#xff0c;date时间指令 2&#xff0c;cal日历指令 3&#xff0c;which和find查找指令 3-1&#xff0c;which指令&#xff1a; 3-2&#xff0c;find…

Python 测试框架unittest和pytest的优劣

一、Unittest Unittest是Python标准库中自带的单元测试框架&#xff0c;Unittest有时候也被称为PyUnit&#xff0c;就像JUnit是Java语言的标准单元测试框架一样&#xff0c;Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试&#xff0c;测试用例的初始化、…

JVM(一)

一、初始JVM 1.1 初始JVM JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 机器码是由二进制编码表示的计算机指令。每个机器码通常对应一个特定的操作,如加法、乘法、跳转等。机器码是计算机能够直接执行的代码,它可以在计算机的内存中存储和执行。…

11 Self-Attention相比较 RNN和LSTM的优缺点

博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https://github.com/nickchen121/Pre-training-language-model 配套博客链接:https://www.cnblogs.com/nickchen121/p/15105048.html RNN 无法做长序列,当一…

Deep Learning for Geophysics综述阅读(未完)

文章题目《Deep Learning for Geophysics: Current and Future Trends》 文章解读&#xff1a;地球物理学&#xff08;人工智能轨道&#xff09;——&#xff08;1&#xff09;文献翻译《面向地球物理学的深度学习&#xff1a;当前与未来趋势》 - 知乎 (zhihu.com) 这里主要列…

【论文阅读】(2023TPAMI)PCRLv2

目录 AbstractMethodMethodnsU-Net中的特征金字塔多尺度像素恢复多尺度特征比较从多剪切到下剪切训练目标 总结 Abstract 现有方法及其缺点&#xff1a;最近的SSL方法大多是对比学习方法&#xff0c;它的目标是通过比较不同图像视图来保留潜在表示中的不变合判别语义&#xff…

基于springboot基于会员制医疗预约服务管理系统项目【项目源码+论文说明】

基于springboot实现会员制医疗预约服务信息系统演示 摘要 会员制医疗预约服务管理信息系统是针对会员制医疗预约服务管理方面必不可少的一个部分。在会员制医疗预约服务管理的整个过程中&#xff0c;会员制医疗预约服务管理系统担负着最重要的角色。为满足如今日益复杂的管理需…

福建泉州航海快艇蓝光三维扫描全尺寸测量船只外观设计三维建模-CASAIM中科广电

造船行业是一个与全球经济发展密切相关的关键行业。近年来&#xff0c;随着全球经济的快速发展&#xff0c;造船行业也不断进步和发展。快艇制造业作为小型、快速的船只的产业&#xff0c;所生产的船只通常用于娱乐、旅游、商业等方面&#xff0c;因此这种类型的快艇对于外观设…