大佬教程收集整理的这篇文章主要介绍了PHP7下协程的实现方法详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
相信大家都听说过『协程』这个概念吧。
但是有些同学对这个概念似懂非懂,不知道怎么实现,怎么用,用在哪,甚至有些人认为yield就是协程!
我始终相信,如果你无法准确地表达出一个知识点的话,我可以认为你就是不懂。
如果你之前了解过利用PHP实现协程的话,你肯定看过鸟哥的那篇文章:nofollow" target="_blank" href="http://www.laruence.com/2015/05/28/3038.html">在PHP中使用协程实现多任务调度| 风雪之隅
鸟哥这篇文章是从国外的作者翻译来的,翻译的简洁明了,也给出了具体的例子了。
我写这篇文章的目的,是想对鸟哥文章做更加充足的补充,毕竟有部分同学的基础还是不够好,看得也是云头雾里的。
先搞清楚,什么是协程。
你可能已经听过『进程』和『线程』这两个概念。
进程就是二进制可执行文件在计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程就是new出来的那个实例。
进程是计算机系统进行资源分配和调度的基本单位(调度单位这里别纠结线程进程的),每个cpu下同一时刻只能处理一个进程。
所谓的并行,只不过是看起来并行,cpu事实上在用很快的速度切换不同的进程。
进程的切换需要进行系统调用,cpu要保存当前进程的各个信息,同时还会使cpuCache被废掉。
所以进程切换不到费不得已就不做。
那么怎么实现『进程切换不到费不得已就不做』呢?
首先进程被切换的条件是:进程执行完毕、分配给进程的cpu时间片结束,系统发生中断需要处理,或者进程等待必要的资源(进程阻塞)等。你想下,前面几种情况自然没有什么话可说,但是如果是在阻塞等待,是不是就浪费了。
其实阻塞的话我们的程序还有其他可执行的地方可以执行,不一定要傻傻的等!
所以就有了线程。
所以我们就可以在编写程序的过程中将可以同时运行的函数用线程来体现了。
线程有两种类型,一种是由内核来管理和调度。
我们说,只要涉及需要内核参与管理调度的,代价都是很大的。这种线程其实也就解决了当一个进程中,某个正在执行的线程遇到阻塞,我们可以调度另外一个可运行的线程来跑,但是还是在同一个进程里,所以没有了进程切换。
还有另外一种线程,他的调度是由程序员自己写程序来管理的,对内核来说不可见。这种线程叫做『用户空间线程』。
协程可以理解就是一种用户空间线程。
协程,有几个特点:
说到这里,你应该明白协程的基本概念了吧?
一步一步来,从解释概念说起!
PHP5提供了一种定义对象的方法使其可以通过单元列表来遍历,例如用foreach语句。
你如果要实现一个可迭代对象,你就要实现Iterator接口:
php;"> var = $array; } } public function rewind() { echo "rewinding\n"; reset($this->var); } public function current() { $var = current($this->var); echo "current: $var\n"; return $var; } public function key() { $var = key($this->var); echo "key: $var\n"; return $var; } public function next() { $var = next($this->var); echo "next: $var\n"; return $var; } public function valid() { $var = $this->current() !== false; echo "valid: {$var}\n"; return $var; } } $values = array(1,2,3); $it = new MyIterator($values); foreach ($it as $a => $b) { print "$a: $b\n"; }
以上是大佬教程为你收集整理的PHP7下协程的实现方法详解全部内容,希望文章能够帮你解决PHP7下协程的实现方法详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。