php多线程,php 协程实现多任务并发

PHP多任务,并发并行,多线程,协程等知识点理解

在讲协程之前,先谈谈多进程、多线程、并行和并发。对于单核处理器,多进程实现多任务的原理是让操作系统给一个任务每次分配一定的 CPU 时间片,然后中断、让下一个任务执行一定的时间片接着再中断并继续执行下一个,如此反复。

由于切换执行任务的速度非常快,给外部用户的感受就是多个任务的执行是同时进行的。

多进程的调度是由操作系统来实现的,进程自身不能控制自己何时被调度,也就是说: 进程的调度是由外层调度器抢占式实现的

而协程要求当前正在运行的任务自动把控制权回传给调度器,这样就可以继续运行其他任务。这与抢占式的多任务正好相反, 抢占多任务的调度器可以强制中断正在运行的任务, 不管它自己有没有意愿。如果仅依靠程序自动交出控制的话,那么一些恶意程序将会很容易占用全部 CPU 时间而不与其他任务共享。

协程的调度是由协程自身主动让出控制权到外层调度器实现的

协程可以理解为纯用户态的线程,通过协作而不是抢占来进行任务切换。

相对于进程或者线程,协程所有的操作都可以在用户态而非操作系统内核态完成,创建和切换的消耗非常低。

简单的说协程 就是提供一种方法来中断当前任务的执行,保存当前的局部变量,下次再过来又可以恢复当前局部变量继续执行。

我们可以把大任务拆分成多个小任务轮流执行,如果有某个小任务在等待系统 IO,就跳过它,执行下一个小任务,这样往复调度,实现了 IO 操作和 CPU 计算的并行执行,总体上就提升了任务的执行效率,这也便是协程的意义

多线程

在单核下,多线程必定是并发的;

不过现在的统一进程的多线程是可以运行在多核CPU下,所以可以是并行的

并发(Concurrency)

是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。

并行(Parallesim)

是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行。

多个操作可以在重叠的时间段内进行。

并行和并发区别

并发指的是程序的结构,并行指的是程序运行时的状态

并行一定是并发的,并行是并发设计的一种

单线程永远无法达到并行状态

协程

协程的支持是在生成器的基础上, 增加了可以回送数据给生成器的功能(调用者发送数据给被调用的生成器函数).

这就把生成器到调用者的单向通信转变为两者之间的双向通信.

我们在上篇文章已经讲过了send方法, 下面让我们理解下协程

在没有涉及到异步执行代码之前,我们的代码都是这样的

function printNum($max, $caller){ for ($i=0; $i<$max; $i++ ) { echo “调度者:” . $caller . ” 打印:” . $i . PHP_EOL; }}printNum(3, “caller1”);printNum(3, “caller2”);# output调度者:caller1 打印:0调度者:caller1 打印:1调度者:caller1 打印:2调度者:caller2 打印:0调度者:caller2 打印:1调度者:caller2 打印:2使用协程后改进的代码,初稿,手动调整生成器执行

# 本代码手动调整了进程执行代码的顺序,当然本代码实现不用协程也可以,只是利用本流程说明协程作用# 生成器给了我们函数中断,协程[生成器send]给了我们重新唤起生成器函数的能力function printNumWithGen($max){ for ($i=0; $i<$max; $i++ ) { $res = yield $i; echo $res; }}$gen1 = printNumWithGen(3);$gen2 = printNumWithGen(3);// 手动执行caller1 再 caller2$gen1->send(“调度者: caller1 打印:” . $gen1->current() . PHP_EOL);$gen2->send(“调度者: caller2 打印:” . $gen2->current() . PHP_EOL);// 手动执行caller1 再 caller2$gen1->send(“调度者: caller1 打印:” . $gen1->current() . PHP_EOL);$gen2->send(“调度者: caller2 打印:” . $gen2->current() . PHP_EOL);// 手动执行caller2 再 caller1$gen2->send(“调度者: caller2 打印:” . $gen2->current() . PHP_EOL);$gen1->send(“调度者: caller1 打印:” . $gen1->current() . PHP_EOL);# output调度者: caller1 打印:0调度者: caller2 打印:0调度者: caller1 打印:1调度者: caller2 打印:1调度者: caller2 打印:2调度者: caller1 打印:2自定义简单定时执行任务示例:

class timer { private $start = 0; // 定时开始时间 private $timer; // 间隔的时间差,单位秒 private $value = 0; // 产生的结果值 private $callback; // 异步回调 private $isEnd = false; // 当前定时器任务是否结束 public function __construct($timer,callable $callback) { $this->start = time(); $this->timer = $timer; $this->callback = $callback; } public function run() { if($this->valid()) { $callback = $this->callback; $callback($this->value ++,$this); $this->start = time(); } } /** * 定时执行检查 */ public function valid() { $end = time(); if($end – $this->start >= $this->timer) { return true; } else { return false; } } public function setEnd($isEnd) { $this->isEnd = $isEnd; } public function getEnd() { return $this->isEnd; }}/** * 模拟阻塞的协程1 * */function taskObject1() { $timer = new timer(1,function($value,timer $timer) { if($value >= 5) { $timer->setEnd(true); } echo ”.’A ‘.$value; }); $tid = (yield getTaskId()); while (true) { if($timer->getEnd() == true) { break; } yield $timer->run(); }}/** * 模拟阻塞的协程2 * */function taskObject2() { $timer = new timer(2,function($value,timer $timer) { if($value >= 3) { $timer->setEnd(true); } echo ”.’B ‘.$value; }); $tid = (yield getTaskId()); while (true) { if($timer->getEnd() == true) { break; } yield $timer->run(); }}$scheduler = new Scheduler;$scheduler->newTask(taskObject1());$scheduler->newTask(taskObject2());$scheduler->run();以上实现的是:产生两个任务,并行执行,并且给每个任务在执行的时候模拟几秒钟的阻塞;让协程切换的时候能顺利切换,其中的任务阻塞不相互影响;

 

思考:

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

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

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

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

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

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

 

 

本文来自投稿,不代表展天博客立场,如若转载,请注明出处:https://www.me900.com/325615.html

(0)

相关推荐

  • 投资1000元3天赚500,0元投资在家就能赚钱

    后来有一天他去批发市场看看能不能把货多少退一点才了解到,原来现在生意都不好做,大家的各方面压力都挺大的,而最大的问题也是流量问题,其次就是竞争关系。 特别是零食这种塑包装的食品,网上就能购买到而且可以屯放很久,对于批发商来说,当地的优势实际上是非常弱的。 后来朋友开始想办法,因为没有店面的地理位置约束了,他开始设想如果手头上有一些零食或者熟食的话,那怎么销售…

    2023-01-29
  • ie浏览器网址(微软edge浏览器官网)

      上个月,Edge 浏览器官方微博宣布,IE 浏览器将于 6 月 16 正式退役。   至此,这个存在了 27 年曾经的浏览器老大哥终于迎来了生命的尽头。 虽然早在 2021 年微软就提示过IE 即将退役,但随着 Edge 官方确认,还是让人不禁唏嘘。   提到 IE 浏览器,咱们 90 后 00 第一时间想到的就是反应迟钝、…

    2023-06-02 投稿
  • 腊八节的来历和腊八粥的相关资料

    今年就是腊八节了,有人们常说“过了腊八就是年”,这一天对百姓来说还是十分重要的,主要的习俗就是喝腊八粥,那么为什么腊八节要喝腊八粥呢?下面小编带来介绍。 腊八节的来历 农历腊月最重大的月份,其中十二月初八,古代称为”腊日”,俗称”腊八节”。腊八是古代欢庆丰收、感谢祖先和神灵(包括门神、户神、宅神、灶神、井神)的…

    投稿 2022-05-09
  • 店铺动态评分多久更新一次(淘宝店铺的动态评分多久更新一次)

    什么是淘宝店铺的动态评分? 所谓淘宝店铺动态评分就是对于本店商品的质量、服务态度、物流速度等方面的评分指标。每项店铺评分均为动态指标,系此前连续90天内所有评分的算术平均值(不包括默认评价)。 温馨提示:每个自然月,相同用户、商家之间存在多次交易的,店铺评分仅计取前3次。 店铺评分一旦做出,就无法修改。 也就是每次客户购买商品后,店铺评价里面的几项内容。而动…

    投稿 2021-11-28
  • 最赚钱的地摊生意,城市地摊财富秘籍

    农村的集市上有很多做生意的人,一般主要分为两种,一种是有门面的,另一种是地摊的。其实地摊具有成本低、自由等特点,很多人都摆过地摊。那么新手摆地摊卖什么好?下面一起来了解下。 1、过年用品 随着农历新年的临近,很多人都会买年货的,如果说成本少的过年用品可是很多的。比如家家贴的福字、门神、窗花等。这些东西的成本都很低,而且出售的价格可是不低的。如果我们能抓住这个…

    2021-11-28
  • 发腮了还能变回去吗?脸部发腮怎么恢复紧致

    很多求美者,年轻或是少年时期看上去脸型还是标准的窄下颌瓜子脸,下颌流畅且内收。但随着年龄不断增长,脸型却开始往方脸靠拢,秀气和精致感减了大半。也因为如此,就有了类似于随着年龄脸型也会“发腮”的说法。   人的下颌骨也是在发育过程中不断生长的。一般来说,人在11~17岁之间,下颌骨会经历另一个生长高峰,下颌骨的体积会有明显的增长。大约17岁的时候女生…

    2022-03-04 投稿
  • 快手个人介绍怎么写才能上热门(快手容易上热门的领域)

    快手覆盖的内容领域日益广泛,因此,运营者在入驻快手平台的时候不能过于草率,不能单纯的根据个人偏好来确定账号的运营方向。本文将主要介绍在快手平台上最容易上热门的8大领域,以此来帮助运营者更好的进行账号的定位。 快手最容易上热门的8大领域 1、搞笑 在很多短视频平台上,搞笑类型的短视频一直都很受欢迎。搞笑短视频的创作便捷之处在于该领域的创作空间较大,自由度较高;…

    2022-05-20 投稿
  • 产品推广方案ppt模板(产品营销推广方案ppt)

    本期分享的PPT模板为高端营销策划书PPT模板,色彩对比强烈抓人眼球,图文排版简约时尚,给人满满的高级感。适合新媒体、网络、科技的类型。 今天给大家分享的PPT模板,包含了绝大多数类型,基本能满足日常工作学习需要,很多PPT稍加修改其实都可以通用。如果没有找到你需要的PPT类型,可以在评论区给我留言,小编会制作相应的PPT分享给大家!! PPT模板都是源文件…

    2022-01-03 投稿
  • 诛仙票房破亿意味着什么?诛仙票房破亿2

    9月13日,电影《诛仙1》正式上映,大竹峰的“张小凡”带着烧火棍来了。电影在宣传期就饱受质疑,尽管是热门IP改编,而且还有新晋爆款流量肖战担任主演,但是不管是人物造型还是海报,都非常劝退。不过动态预告出来后,也有不少网友表示“可以一看”。 在首映当天,等待了一上午之后,《诛仙1》在豆瓣终于有了开画评分6.7,虽然之后掉到了6.6,但对于新上映的片子来说,这个…

    2023-01-30
  • 速龙x4 760k相当于i几

    就在昨天我一朋友跑到我家来让我去帮他装一下显卡,我这朋友没别的爱好就是喜欢打游戏,这次应该是在网上买了一张显卡,说实话懂电脑好处就是可以经常帮妹子排忧解难,但同时坏处就是几乎你身边所有朋友电脑有问题都会不约而同来找你,就这个月我都帮同事,朋友,亲戚装了好多机器了,有些时候真的感觉有些厌倦了,但是又不好意思说! 说实话高u低显,或者低u高显,确实在装机这个行业…

    投稿 2023-04-10
  • 2022口碑最好的2000元机,2000元手机性价比排行

    现在2000元价位的手机,可以用「真香」来形容!当大家吐槽着芯片涨价,助涨手机价格,旗舰机型动辄四五千时,谁曾想,在2000元市场里,竟疯狂内卷起来。搭载骁龙 870这种次旗舰级别芯片的手机,价格跳水至1999元,一下子聚焦大量的关注。下面我就来为大家推荐四款两千元档手机,感兴趣的朋友千万不要错过。 realme X7 Pro 至尊版 参数规格: 性能:天玑…

    2022-03-04
  • 买篮球鞋的正品网站(买正品折扣鞋的网站)

    废话少说,直入正题。 当客网 全名是这个:get-我的运动装备潮流社区。 应该有人用过他们家的app——GET。不过我喜欢的是其“装备库”,收录了许多经典球鞋或者科技的图文资料,类似于虎扑的装备中心,但相比较而言更加全面一点。(相比较而言) 移动端进入装备库似乎不太方便,我的方法是利用浏览器的电脑模式,进入搜索栏。另外,他们的装备库也有一点小错误,比如把T-…

    2021-11-19 投稿