php 通过 yield 实现协程有什么使用场景
来源:https://segmentfault.com/q/1010000010018151
参考:https://www.cnblogs.com/lynxcat/p/7954456.html
协程可以用在,异步网络 IO 的时候,使其成为非阻塞的。
比如你在一个 http 请求里面,你需要请求外面的接口,那么会有下面的场景。
你的前置 server 是 nginx,nginx 是非阻塞异步的,但是 php-fpm 是同步阻塞的。那么当你在请求外面接口的时候,这个任务就会被阻塞。(这里补充一下,php-fpm 的 Worker 进程是同步阻塞的)
假设你使用协程,那么当你在请求接口的时候,你的这个任务就可以暂停,保存上下文。然后呢,当你的接口返回了之后,重新调起这个任务继续执行。你的进程就不必耗在这一个任务上了,可以去处理其它的 http 请求了。这样是不是并发量就高了?
同理,当你的请求在查询数据库的时候,也是一个 IO 请求,也是同步的。协程就可以让你这些 IO 编程异步非阻塞的,从而增大你的并发量。这主要是让你的 CPU 可以在等待 IO 的时候,可以处理别的事情。所有的 IO 请求都可以通过协程做到这一点。
你的这篇文章我看过,是很好的一篇文章。这里作者用 yield 实现了一个任务调度,就是干我上面说的那些事情的。你也可以看看鸟哥翻译的 http://www.laruence.com/2015/...,可以说是对你看到的这个翻译的一个补充。他通过 yield 实现了一个异步非阻塞的服务器,当然只是一个 demo 啦。有个例子看起来应该会好一点。
yield的好处:
1.节省内存空间(因为别人的都是一堆数组,货真价实的一个个的放进内存里,但是yield是迭代器,从头到尾就只有他一个,相当于替换符号!)
2.协程可以用在,异步网络 IO 的时候,使其成为非阻塞的。
php 通过 yield 实现协程有什么使用场景的更多相关文章
- Python并发实践_02_通过yield实现协程
python中实现并发的方式有很多种,通过多进程并发可以真正利用多核资源,而多线程并发则实现了进程内资源的共享,然而Python中由于GIL的存在,多线程是没有办法真正实现多核资源的. 对于计算密集型 ...
- PHP的生成器、yield和协程
虽然之前就接触了PHP的yield关键字和与之对应的生成器,但是一直没有场景去使用它,就一直没有对它上心的研究.不过公司的框架是基于php的协程实现,觉得有必要深入的瞅瞅了. 由于之前对于生成器接触不 ...
- 深入理解yield(二):yield与协程
转自:http://blog.beginman.cn/blog/133/ 协程概念 1.并发编程的种类:多进程,多线程,异步,协程 2.进程,线程,协程的概念区别: 进程.线程和协程的理解 进程:拥有 ...
- 用yield 实现协程 (包子模型)
协程是一种轻量级的线程 无需线程上下级的开销, 所有的协程都在一个线程内执行 import time def consumer(name): print('%s is start to eat bao ...
- python yield实现协程(生产者-消费者)
def customer(): r="" while True: n=yield r#,接收生产者的消息,并向消费者发送r print("customer receive ...
- 用yield写协程实现生产者消费者
思路: yield可以使得函数阻塞,next,和send可以解阻塞,实现数据不竞争的生产者消费者模式 代码: import random #随机数,模拟生产者的制造物 def eat(): #消费者 ...
- python基于yield实现协程
def f1(): print(11) yield print(22) yield print(33) def f2(): print(55) yield print(66) yield print( ...
- 再议Python协程——从yield到asyncio
协程,英文名Coroutine.前面介绍Python的多线程,以及用多线程实现并发(参见这篇文章[浅析Python多线程]),今天介绍的协程也是常用的并发手段.本篇主要内容包含:协程的基本概念.协程库 ...
- 用yield实现python协程
刚刚介绍了pythonyield关键字,趁热打铁,现在来了解一下yield实现协程. 引用官方的说法: 与线程相比,协程更轻量.一个python线程大概占用8M内存,而一个协程只占用1KB不到内存.协 ...
随机推荐
- docker下centos7编译安装ffmpeg
1.安装基础命令 docker下精简版centos没有make等命令,先安装: yum -y install gcc automake autoconf libtool make yum instal ...
- mybatis采坑之Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '?°?é?“é?“' in 'field list'
最后找到问题: 符号问题 修改之后正常
- Python——office编程
一.office编程需求 二.Excel编程 import xlrd path=input("输入路径:") workbook=xlrd.open_workbook(path)#打 ...
- USCOSII
一.要求 下载附件,尝试在vc6.0中编译运行ucos 下载附件,尝试在vs2017中编译运行ucos,给出你遇到的问题和解决方式 ucos是如何分层的? HAL都有哪些代码? 分析任务是如何切换的? ...
- 实现ls
一.任务详情 参考伪代码实现ls的功能,提交代码的编译,运行结果截图,码云代码链接 打开目录文件 针对目录文件 读取目录条目 显示文件名 关闭文件目录文件 二.伪代码 opendir while(re ...
- 7.Metasploit后渗透
Metasploit 高阶之后渗透 01信息收集 应用场景: 后渗透的第一步,更多地了解靶机信息,为后续攻击做准备. 02进程迁移 应用场景: 如果反弹的meterpreter会话是对方打开了一个你预 ...
- Three.js 中的参数调试控制插件dat.GUI.JS - [Three.js] - [dat.GUI]
不论是处于特殊功能的需要,还是处于效果调试方便,我们可能都需要修改模型中的参数值.在Three.js中,谷歌提供了一个js库,即dat.GUI.js用于处理这种需求. 通过该库,我们就不需要通过手动修 ...
- Linux学习第10天-命令执行顺序控制与管道
学习重点: cut,grep,wc,sort命令的使用 管道的理解 一.顺序执行多条命令 当我们需要使用apt-get安装一个软件,然后安装完成后立即运行安装的软件(或命令工具),又恰巧你的主机才更换 ...
- Light of future-测试总结
目录 1.描述项目的测试工作安排 2.测试工具选择和运用 3.测试用例文档pdf的github链接地址 4.测试体会 5.项目测试评述 发布界面 后台CRUD 归属班级 →2019秋福大软件工程实践Z ...
- 在docker中部署redis主从配置
环境说明: 阿里云服务器 Ubuntu 16.04 docker 1.拉取Redis镜像 docker pull redis 2.配置Redis启动配置文件,此处我创建一个专用目录,存放Redis相关 ...