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 的时候,使其成为非阻塞的。
最新文章
- COGS1008. 贪婪大陆[树状数组 模型转换]
- C# DataTable中根据某Column值(不重复)获取该值所在行
- jQuery--事件总结
- unkow jdbc driver : http://maven.apache.org
- LeetCode Palindrome Permutation II
- Codeforces Round #367 (Div. 2)---水题 | dp | 01字典树
- 错误 -force-32bit 与 ANDROID_EMULATOR_FORCE_32BIT=true
- Opacity多浏览器透明度兼容处理(转)
- 使用android.view.TouchDelegate扩大View的触摸点击区域
- 【Itext】7步制作Itext5页眉页脚pdf实现第几页共几页
- [转帖]ulimit、limits.conf、sysctl和proc文件系统
- 读取HTML文件进行格式化解析
- 买了本Delphi面向对象编程思想,正在看,产生些问题。
- 使用cxf两个声明导致ObjectFactory 类中发生冲突
- 【编程基础】编译器 cc、gcc、g++、CC 的区别
- solr 加载 停用/扩展词典
- VMWare虚拟机安装创建虚拟机的使用教程
- html5--移动端视频video的android兼容,去除播放控件、全屏等
- nodejs v8引擎
- 安装虚拟机与Linux的学习
热门文章
- 用pymysql和Flask搭建后端,响应前端POST和GET请求
- 加密解密 Python
- 【poj 2429】GCD &; LCM Inverse (Miller-Rabin素数测试和Pollard_Rho_因数分解)
- F - F HDU - 1173(二维化一维-思维)
- C++判断输入是否为double
- Python Count函数的应用
- Java第三十五天,用JDBC操作MySQL数据库(一),基础入门
- Flask 入门(七)
- String 对象-->;substring() 方法
- 学习《深入应用c++11》1