php协程(Coroutine)学习笔记_Gavin_new的博客-CSDN博客


本站和网页 https://blog.csdn.net/gavin_new/article/details/54603490 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

php协程(Coroutine)学习笔记_Gavin_new的博客-CSDN博客
php协程(Coroutine)学习笔记
Gavin_new
于 2017-01-18 18:11:24 发布
6547
收藏
分类专栏:
后端
PHP相关
文章标签:
php
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gavin_new/article/details/54603490
版权
后端
同时被 2 个专栏收录
39 篇文章
0 订阅
订阅专栏
PHP相关
21 篇文章
0 订阅
订阅专栏
PHP5.5中加入了一个新特性—迭代生成器和协程。
一. 什么是协程(Coroutine)?
在协程出现之前,要实现多任务并发,在无OS(操作系统)时代,可以使用状态机的思想对多任务进行拆解,在单进程环境中运行多任务,但是这种模式下需要开发者对每个任务有清晰的了解,也要开发者自行开发与任务相关功能(如任务间的通讯)。
后来出现了OS(操作系统),咱们就开始使用OS提供的进程和线程功能来轻易实现多任务了。在OS中,进程的上下文切换是OS内核控制。但是后来却出现了一个问题,频繁的进程上下文切换导致了OS性能的降低(主要是短时执行消耗小的任务进程)。
为了解决这个问题,开始提出新的概念,就是在同一进程或线程中运行多个任务,这种问题就相当于回到了早期的无OS时代的多任务实现。而现在解决方案称为协程。其本质是,将将任务切换的部分工作从内核转移到应用层。
二. php中协程的基本工具以及基本使用
要实现协程,php给出了两个新东西:生成器和yield关键字。
什么是生成器? 生成器继承了实现了迭代器,在php代码中和函数的定义类似,不过内部使用了yield关键字,如:
<?php
function gen(){
echo "hello gen".PHP_EOL;//step1
$ret = (yield "gen1"); //step2
var_dump($ret); //step3
$ret = (yield "gen2"); //step4
var_dump($ret); //step5
?>
使用时,这样子:
<?php
$my_gen = gen();
var_dump($my_gen->current());
var_dump($my_gen->send("main send"));
?>
好了,这样使用代表什么意思呢? (1)首先$my_gen = gen();这句代码只是实例化一个新的生成器,里面的代码并未执行; (2)\$my_gen->current();这句代码就执行了生成器里面的step2中的yield “gen1”了,这时代码中断,并且字符串“gen1”被传进了生成器\$my_gen,并且作为current()函数的返回值; (3)send(“main send”)执行完之后,字符串”main send”被传递进了生成器\$my_gen, 同时生成器作为step2中yield的返回值传递给ret; (4) 生成器step3执行完后,在step4时,遇到yield就会再次进入中断。
三. 协程的特点
(1)为应用层实现多任务提供了工具; (2)协程不允许多任务同时执行,要执行其它协程,必须使用关键字yield主动放弃cpu控制权; (3)协程需要自己写任务管理器,以及任务调度器; (4)减轻了OS处理零散任务和轻量级任务的负担;
Gavin_new
关注
关注
点赞
收藏
打赏
评论
php协程(Coroutine)学习笔记
PHP5.5中加入了一个新特性—迭代生成器和协程。一. 什么是协程(Coroutine)?在协程出现之前,要实现多任务并发,在无OS(操作系统)时代,可以使用状态机的思想对多任务进行拆解,在单进程环境中运行多任务,但是这种模式下需要开发者对每个任务有清晰的了解,也要开发者自行开发与任务相关功能(如任务间的通讯)。后来出现了OS(操作系统),咱们就开始使用OS提供的进程和线程功能来轻易实现多任务了。在
复制链接
扫一扫
专栏目录
PHP:纤程
全栈技术博客
09-30
227
PHP:纤程
php实现过程,PHP协程实现过程详解
weixin_42263617的博客
03-11
155
实现 PHP 协程需要了解的基本内容。多进程/线程最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题。进程模型出现的最早,从Unix 系统诞生就开始有了进程的概念。最早的服务器端程序一般都是 Accept 一个客户端连接就创建一个进程,然后子进程进入循环同步阻塞地与客户端连接进行交互,收发处理数据。多线程模式出现要晚一些,线程与进程相比更轻量,而且线程之间共享内存堆栈,所以不同的线程之间...
参与评论
您还未登录,请先
登录
后发表或查看评论
php 简单考试系统源码,php实现在线考试系统【附源码】
weixin_39747293的博客
03-10
1775
温馨提示:本信息由【金聪采编】搜集整理发布,版权归原作者及发布者所有,您如有异议请 举报 或者 版权申诉。多任务 (并行和并发)在讲协程之前,先谈谈多进程、多线程、并行和并发。对于单核处理器,多进程实现多任务的原理是让操作系统给一个任务每次分配一定的 CPU 时间片,然后中断、让下一个任务执行一定的时间片接着再中断并继续执行下一个,如此反复。由于切换执行任务的速度非常快,给外部用户的感受就是多个任...
PHP实现协程
tuantuanls的专栏
04-01
925
在服务器编程当中,为了实现异步,经常性的需要回调函数,例如以下这段代码
function send($value) {
$data = process($value);
onReceive($data);
function onReceive($recv_value) {
var_dump($recv_value);
function process($val
PHP 协程
wgchen
03-17
598
PHP 协程
PHP的协程需要生成器(yield)配合,先看看迭代器。
生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。
一:迭代器(Iterator):
在php中,数组可以遍历,对象也可以遍历,除此之外继承了Iterator接口的对象也可以遍历。
PHP内置的Iterator接口有5个方法:
Iterator::current — 返回当前
PHP学习笔记18:协程
梦幻天空
12-11
1247
PHP学习笔记18:协程
图源:php.net
正如Python关于协程的PEP所讲,异步编程和并发已经是编程的一个热门领域,所以无论是老派语言如Python,或者是新语言Go,要么是添加新特性以支持协程,要么是天生就对协程和并发有完整支持。
但在这方面php就相当落(la)后(kua)了。
或许这和语言的应用领域和使用方式有一些关系,php作为一个和Apache等web service紧密结合的Web开发语言,绝大部分php项目都是依托于web service处理和转发请求的,php本身并不需要花大力气
Hyperf 高性能PHP协程框架实战(八) 协程
李维山的博客
05-25
436
php的协程
读万卷书,行万里路
05-25
1082
在php中,实现协程主要由两种方式
1.yield生成器的实现
2.swoole扩展实现
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。
我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程 由当前协程来控制
协程执行顺序
首先,我们来看一个原生php代码:
<?php
function task
php协程 多线程,PHP中协程实现学习笔记
weixin_32311541的博客
03-10
63
第一部分 什么是协程(Coroutine)一、概念0、先来看看Wikipedia Coroutine上的定义(Wikipedia协程中文定义):Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to...
coroutine php_php中协程的详细介绍(代码)
weixin_34289350的博客
03-08
290
本文先介绍了生成器的概念,重点是yield的用法及生成器的接口。协程部分则简要说了协程的原理,以及PHP协程编程中应当注意的事项。PHP自5.5起引入了生成器(Generator),基于其可实现协程编程。本文先回顾生成器,然后过渡到协程编程。yield与生成器生成器生成器是一种数据类型,实现了iterator接口。不能通过new得到生成器实例,也没有获取生成器实例的静态方法。得到生成器实例的唯一办...
php 协程 有什么用,PHP 协程是什么意思?
weixin_30953203的博客
03-11
236
PHP 协程是什么意思?PHP协程就相当于线程,线程意思就是在切换线程上下文时,要先保存上一个线程的上下文,然后执行下一个线程,当条件满足时,切换回上一个线程,并恢复上下文,协程也是这样,只不过协程是由用户调度的,而线程是系统调度的。PHP 协程用法协程的支持是在迭代生成器的基础上, 增加了可以回送数据给生成器的功能(调用者发送数据给被调用的生成器函数). 这就把生成器到调用者的单向通信转变为两者...
php7协程通信使用,PHP7下的协程实现
weixin_33273250的博客
04-02
101
原标题:PHP7下的协程实现什么是协程先搞清楚,什么是协程。你可能已经听过『进程』和『线程』这两个概念。进程就是二进制可执行文件在计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程就是new出来的那个实例。进程是计算机系统进行资源分配和调度的基本单位(调度单位这里别纠结线程进程的),每个CPU下同一时刻只能处理一个进程。所谓的并行,只不过是看起来并行,CPU事实上在用很快的速度切换不同...
php 打印_PHP多任务,并发并行,多线程,协程等知识点理解
weixin_39761696的博客
12-06
115
在讲协程之前,先谈谈多进程、多线程、并行和并发。对于单核处理器,多进程实现多任务的原理是让操作系统给一个任务每次分配一定的 CPU 时间片,然后中断、让下一个任务执行一定的时间片接着再中断并继续执行下一个,如此反复。由于切换执行任务的速度非常快,给外部用户的感受就是多个任务的执行是同时进行的。多进程的调度是由操作系统来实现的,进程自身不能控制自己何时被调度,也就是说: 进程的调度是由外层调度器抢占...
PHP多任务,并发并行,多线程,协程等知识点理解
weixin_30896763的博客
06-23
756
对于单核处理器,多进程实现多任务的原理是让操作系统给一个任务每次分配一定的 CPU 时间片,然后中断、让下一个任务执行一定的时间片接着再中断并继续执行下一个,如此反复。
由于切换执行任务的速度非常快,给外部用户的感受就是多个任务的执行是同时进行的。
多进程的调度是由操作系统来实现的,进程自身不能控制自己何时被调度,也就是说: 进程的调度是由外层调度器抢占式实现的
而协程要求当前正...
coroutine php_PHP 协程实现
weixin_39524984的博客
03-08
104
多进程/线程最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题。进程模型出现的最早,从Unix 系统诞生就开始有了进程的概念。最早的服务器端程序一般都是 Accept 一个客户端连接就创建一个进程,然后子进程进入循环同步阻塞地与客户端连接进行交互,收发处理数据。多线程模式出现要晚一些,线程与进程相比更轻量,而且线程之间共享内存堆栈,所以不同的线程之间交互非常容易实现。比如实现一个聊天室,...
PHP协程程序
最新发布
weixin_39218464的博客
05-29
241
协程
协程与子进程(某个主程序的一部分代码)一样,协程也是一种程序组件。
协程(coroutine)不是进程或线程,其执行过程更类似于子进程,或者说不带返回值的函数调用
对比
一个程序可以包含多个协程,对比一个进程可以包含多个线程,多个线程相对独立,有自己的上下文,切换受系统控制;协程也相对独立,有自己的上下文,但切换由自己控制,从当前协程切换到其它协程由当前协程来控制。
协程的支持
Lua5
Python的yield关键字
PHP5.5的yield关键字
生成器使用
迭代器(Iterator)
可在内部迭
php实现协程,真正的异步
热门推荐
ebag的编程博客
06-15
1万+
github上php的协程大部分是根据这篇文章实现的:http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html。
它们最终的结果都是把回调变成了优雅的顺序执行的代码,但还是阻塞的,不是真正的异步。
比如最热门的:https://github.com/recoilphp/
PHP 协程实现
weixin_34248849的博客
10-01
1438
2019独角兽企业重金招聘Python工程师标准>>>
...
狂拽酷炫吊炸天:用 PHP 协程实现多任务协作
loongwong2011的博客
09-13
2472
https://www.v2ex.com/t/289499
PHP 5.5 中最重要的特性之一就是对协程( coroutine )和生成器( generator )的支持。生成器的特性已经由官方文档和许多博文(比如这一篇和这一篇)讲解得很充分了。另一方面,协程受到的关注则较少。这是因为协程的功能相较而言更加强大,但却难以讲解。
本文会使用协程实现一个任务调度器,以此帮助你理
php-协程的实现
猛犸象
06-15
917
协程的实现参考:
http://www.laruence.com/2015/05/28/3038.html
https://segmentfault.com/a/1190000012457145?utm_source=tuicool&utm_medium=referral
既然协程性能这么高,那为什么使用的还是很少呢,还是其使用场景不是很多,加上协程还是有点不好理解。
协程的作用是实施任务...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:编程工作室
设计师:CSDN官方博客
返回首页
Gavin_new
CSDN认证博客专家
CSDN认证企业博客
码龄7年
暂无认证
68
原创
11万+
周排名
124万+
总排名
21万+
访问
等级
2852
积分
10
粉丝
39
获赞
38
评论
33
收藏
私信
关注
热门文章
goLang引入自定义包
12976
PHP之pthread拓展使用以及坑
12225
微信网页返回到前一列表的历史位置(解决方案)/兼容苹果
10437
利用H5Canvas进行前端图片压缩再上传笔记
9346
golang中传递中值传递以及指针传递
9097
分类专栏
前端开发
6篇
前后端
2篇
后端
39篇
通用技术
11篇
Laravel相关
5篇
PHP相关
21篇
数据结构和算法
5篇
MySql
5篇
Redis
2篇
svn
1篇
tcp-ip
2篇
golang
6篇
web
2篇
最新评论
SVN查看log时报“svn there has been a problem contacting the server”错误
francisHuang:
没有看到svnserve.conf这个文件
goLang引入自定义包
qq_45119956:
那个GOPATH这个没表现在出来吧
探讨Docker容器中修改系统变量的方法[转]
mfslx:
可以尝试改宿主机的系统变量
SVN查看log时报“svn there has been a problem contacting the server”错误
java持续实践:
改成none之后也没用啊
发布一个轻量级的PHP实现的WEBSOKCET引擎-EZ_WS
普通网友:
有个问题想问下,这个怎么在服务端主动推送消息给前端?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
redis源码阅读之数据结构(浅易说明)
golang中传递中值传递以及指针传递
php-fpm生产环境下的调试strace
2020年1篇
2018年9篇
2017年35篇
2016年35篇
目录
目录
分类专栏
前端开发
6篇
前后端
2篇
后端
39篇
通用技术
11篇
Laravel相关
5篇
PHP相关
21篇
数据结构和算法
5篇
MySql
5篇
Redis
2篇
svn
1篇
tcp-ip
2篇
golang
6篇
web
2篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
Gavin_new
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值