位置: 编程技术 - 正文

关于PHP中协程和阻塞的一些理解与思考(php通信协议)

编辑:rootadmin

推荐整理分享关于PHP中协程和阻塞的一些理解与思考(php通信协议),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php协程提案,php 协程,php协程异步请求,php8协程,php 进程 线程 协程,php 协程,php8协程,php8协程,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

本文主要给大家介绍了关于PHP中协程和阻塞的理解与思考,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

进程、线程、协程

关于进程、线程、协程,有非常详细和丰富的博客或者学习资源,我不在此做赘述,我大致在此介绍一下这几个东西。

进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。

PHP中的协程实现基础 yield

yield的根本实现是生成器类,而迭代器类是迭代器接口的实现:

以上解析可以参考PHP官方文档。

关于PHP中协程和阻塞的一些理解与思考(php通信协议)

产生两个任务,并行执行,并且给每个任务在执行的时候模拟几秒钟的阻塞; 让协程切换的时候能顺利切换,其中的任务阻塞不相互影响;

思考:

我为什么要做以上这件事情呢?因为我发现协程实现虽然很强大也很有意思,能让多任务并行,但是我在其中一个任务里调用系统函数 sleep() 的时候,阻塞任务会阻止协程切换,其实从协程的实现原理上来书也是这么回事。

那么,我也就想模拟协程阻塞,但是不产生阻塞看是否可行。PHP本身只提供了生成器为协程调用提供了支撑,如果不依赖扩展,没有提供多线程的程序实现方式,没有java那么强大,可以开子线程进行实现。

我印象中java的子线程是独立执行且不会相互阻塞的,所以我在想,PHP既然可以实现类似于多线程这样的机制,那么能不能实现调用过程中非阻塞呢?

经过这样一个实现和思考,一开始是陷入了一个误区的,是由于PHP原生函数 sleep() 阻塞造成的思维误区,那就是认为要想真正实现非阻塞或者说实现异步的话,是必须依赖于语言底层的。

后来,我想明白了一个道理,既然某个方法或者函数在执行过程中,会产生阻塞,那么把当前这个方法换成自定义的,做成非阻塞(相对于整个协程调度来说)不就行了吗?比如上面的定时执行我自己实现了一个。

而另一方面,协程调度本身的目的也是为了把任务执行过程切成尽量小片,从而快速切换执行,达到并行的目的。从这方面来看,协程应该也算是一种程序设计思想。

以下是一个程序切成尽量小片执行的例子:

这个例子是把原本用 range 生成一个很大的整型数组的方式切换为分片执行,也就是说在遍历的时候再去取到指定的值,从代码上来看,内存消耗相对于之前来说就非常小了。

总结

标签: php通信协议

本文链接地址:https://www.jiuchutong.com/biancheng/287494.html 转载请保留说明!

上一篇:PHP实现的自定义图像居中裁剪函数示例【测试可用】(php自定义函数的语法格式)

下一篇:PHP递归实现文件夹的复制、删除、查看大小操作示例(php递归遍历文件夹)

  • 税控盘维护费会计分录怎么写
  • 视同销售计税价格如何确定?
  • 没有购销合同的销售额交印花税吗
  • 残保金计入管理费用还是营业税金及附加
  • 融资租赁租入设备
  • 个人独资企业500万以下
  • 营改增后企业所得税怎么算
  • 商品流通企业一般采用
  • 有限合伙企业中有限合伙人承担责任的方式为
  • 失业养老保险如何办理
  • 小规模纳税人代理记账一般多少钱
  • 研发支出是什么性质的科目
  • 出口退税金额和进项税额不一致
  • 收了公司的款项不拿回公司属于什么行为
  • 月底结转应交税费怎么弄
  • 农村合作社开的鸡蛋免税票可以抵进项税吗?
  • 境外施工
  • 月底结账哪些科目有余额
  • 公司集体活动的目的与意义
  • 购买汽车车辆购置税个人垫付,企业付给个人的附件归属
  • 国外发票可以报销吗
  • 五险一金的会计分录怎么写
  • 如何修改系统时间为12/24小时制
  • 赠品没有收到
  • php fwrite函数
  • 外销收入申报表怎么填
  • 月度计提所得税怎么调整
  • php编写网站
  • vue数据更新会触发什么生命周期
  • 销售退回的账务处理附什么底稿
  • 先买入再卖出
  • 预收账款增值税纳税义务
  • php数组函数面试题
  • 损失函数解读例题
  • yii2框架面试题
  • 针对多用户实现什么功能
  • 关于预付账款的特点
  • ps打不出字怎么回事
  • 软件成本如何归类管理
  • 没有到位的注资企业
  • python文档怎么查看
  • sqlserver2008无法连接到local用户登录失败
  • 跨年的房租费用怎么做账
  • 单位集体旅游算工资吗
  • 去年亏损今年盈利同比怎么算
  • 购买原材料保险费分录
  • 小规模出口免税是什么意思
  • 应收账款记账凭证怎么写
  • 怎么样打印自己想要的内容
  • 如何理解现金折扣
  • 承兑汇票怎么拿钱
  • 复利终值与现值的关系
  • centos 7安装教程
  • sqlserver中存储过程
  • sqlserver not in 语句使程充崩溃
  • mysql绿色版配置
  • win10 bios模式
  • 国产系统叫啥
  • 电脑安装了安卓系统没用
  • windows7怎么添加设备
  • mac怎么设置应用权限
  • win10可以关闭的功能
  • win8.1使用技巧
  • windows7怎么设置右键菜单
  • python标准库函数有哪些
  • js移动到指定位置
  • cmd for /f
  • 浅谈jQuery中Ajax事件beforesend及各参数含义
  • vlw框架论坛
  • nodejs mocha
  • js拖拽生成页面
  • 动态生成类对象
  • zabbix 微信
  • Python的collections模块中namedtuple结构使用示例
  • 电子税务局怎么删除办税员
  • 学校 税务登记
  • 2022年最新最全食物嘌呤含量一览表
  • 简易计税方法开的是普票还是专票
  • 退契税可以不用本人银行卡吗
  • 无锡国税局电话咨询热线
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设