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)

相关推荐

  • 央视宝晓峰43岁仍未婚单身(新闻联播美女主播宝晓峰)

    央视宝晓峰43岁仍未婚单身(新闻联播美女主播宝晓峰)央视宝晓峰43岁仍未婚单身(新闻联播美女主播宝晓峰)央视宝晓峰43岁仍未婚单身(新闻联播美女主播宝晓峰)央视宝晓峰43岁仍未婚单身(新闻联播美女主播宝晓峰)

    宝晓峰 2020年9月12日,央视美女主播宝晓峰与刚强搭档首次主持《新闻联播》。她沉稳、大气、清新的主持风格,深得观众好评。网友将宝晓峰与刚强称为“宝刚组合”。 入驻《新闻联播》前,宝晓峰已主持了《亚洲报道》《新闻早8点》《媒体广场》《朝闻天下》《新闻30分》《新闻直播间》《午夜新闻》等多档节目,在观众中有着广泛的影响。 因忙于事业,宝晓峰至今未婚单身。作为…

    2022-01-07 投稿
  • 新出网游推荐,现在有什么新出的爆款网游

    新出网游推荐,现在有什么新出的爆款网游新出网游推荐,现在有什么新出的爆款网游新出网游推荐,现在有什么新出的爆款网游新出网游推荐,现在有什么新出的爆款网游

    2021年又接近年尾了,白银之手为您盘点下今年出现了哪些爆款网游试图颠覆当下的端游市场格局呢? 1.《新世界》 但《新世界》对于咱们国人玩家来说十分不友好,亚洲没有服务器不说,游戏还没有中文。尽管如此还有大量玩家顶着延迟和语言障碍在外服和老外们争夺城池,可见游戏的魅力。 2.《永劫无间》 今天有一款武侠吃鸡游戏重新让吃鸡游戏火了起来,这款游戏就是永劫无间。 …

    2023-01-27 投稿
  • 春节送礼送什么给领导(送领导寓意步步高升的礼物)

    春节送礼送什么给领导(送领导寓意步步高升的礼物)春节送礼送什么给领导(送领导寓意步步高升的礼物)春节送礼送什么给领导(送领导寓意步步高升的礼物)春节送礼送什么给领导(送领导寓意步步高升的礼物)

      【工作题记】 职场关系最重要的其实是你的领导,如果搞不定和领导的关系的话,那么你的能力再强、业绩再好,恐怕也难以得到好评,难以获得应有的晋升与涨工资。 只把事情做好是不够的! 除此之外,还要打量好和领导的关系,但是这种关系也是一种双面刃,一旦把握不好也会刺伤双方。 一般与领导打好关系,大家常采用方法是吃饭,蜗牛君是反对这种做法的,因为过于敏感,…

    2021-11-19 投稿
  • 降血糖的药,降血糖最有效药物有哪些

    在我国,司美格鲁肽获批用于治疗成人2型糖尿病及降低2型糖尿病合并心血管疾病患者的心血管不良事件风险,但其减重适应证还未获批。此外,使用司美格鲁肽还有许多不良反应和禁忌证,患者需要通过正规医院渠道获取该药,并在医生的指导下使用。无论在国内还是国外,司美格鲁肽的使用都有很多注意事项和条件限制,并非人人可用的“减重神器”。 ◎实习记者 沈 唯 夏天到了,减重被不少…

    2023-07-02
  • 有什么日结可以做的工作?八戒日付赚钱

    现在手里特别流行,而且手机也越来越智能化,同时手机里的能赚钱的方式也越来越多,在众多的手机赚钱方法中比较靠谱的平台可能并没有那么多,给大家分享一下我亲测靠谱的平台 1、微任务 对于这项工作,我个人是非常喜欢的,简单易上手,而且收入很稳定。现在有许多可以通过手机完成任务赚钱的公住号平台,任务难度有高的也有低的,价格自然有多有少,这个完全取决于任务难度。正常单价…

    2022-04-19
  • cpu提炼黄金直接用火烧可以吗(cpu提炼黄金成本)

    cpu提炼黄金直接用火烧可以吗(cpu提炼黄金成本)cpu提炼黄金直接用火烧可以吗(cpu提炼黄金成本)cpu提炼黄金直接用火烧可以吗(cpu提炼黄金成本)cpu提炼黄金直接用火烧可以吗(cpu提炼黄金成本)

    如今的时代,大家的生活水平都有了很大的提高,各种家用电器早已经走入千家万户。与此同时也产生了许多废旧的家用电器,这也催生了废旧家电回收行业。那么,这些大家都不要的废旧家电还有什么用处呢?废品回收公司又是怎么用这些废旧家电赚钱的呢? 事实上,这些被回收的家用电器品相各不同,有一些性能还不错,就会被维修好之后回流到二手市场,而有一些电子元器件还能使用,就会被拆解…

    2023-01-30 投稿
  • 淘宝不砸钱慢慢能起来吗?

    淘宝不砸钱慢慢能起来吗?淘宝不砸钱慢慢能起来吗?淘宝不砸钱慢慢能起来吗?淘宝不砸钱慢慢能起来吗?

    最近很多商家咨询翰林说,翰林老师,为什么我最近这段时间在直通车、超级推荐上花了很多钱,但数据还是不理想呢? 这里其实就是很多商家都会陷入的一个误区,以为只要砸钱做推广,就一定能做好店铺,做好宝贝的数据。其实这是不一定的,做推广和做好宝贝数据,他并不是一个必然的关系。 我们想要通过做推广实现做好宝贝数据的目的,还要考虑到以下这两个方面: 一、要有产品基础 了解…

    2022-06-03 投稿
  • 什么是诚信通(诚信通)

    说到电商,谈到阿里很多人最先想到的一定是淘宝,很多人甚至都不知道马云最先起家的并不是淘宝而是诚信通。在我接触这个平台之前我也不知道还有这么一个平台,一样可以购物甚至价格还要比淘宝低得多得多。但是很多办厂的源头厂家对这个平台一定不陌生。很多做快销品的、服装、鞋帽的最早的时候一定对这个平台非常了解。2002年,诚信通服务正式诞生,是针对内贸企业打造的,以企业诚信…

    2021-12-26
  • 全球十大知名运动品牌排名(国外男运动鞋品牌大全)

    全球十大知名运动品牌排名(国外男运动鞋品牌大全)全球十大知名运动品牌排名(国外男运动鞋品牌大全)全球十大知名运动品牌排名(国外男运动鞋品牌大全)全球十大知名运动品牌排名(国外男运动鞋品牌大全)

    二十年前,国内运动品牌处于百花齐放的时代,高端品牌基本都被国外知名品牌所占据,国产知名品牌还处于中端地位。 很多70后、80后甚至90后,为了买一双或者一件国外知名品牌的运动装备,可能很多天都处于节省的状态。每当购买到一件崭新的运动装备,甚至会激动、兴奋好多天。 就给给位友友介绍全球十大知名运动品牌。 1、PUMA彪马官方 男女情侣同款撞色休闲鞋BLAZE …

    2023-06-09 投稿
  • 沈阳国美网上商城,国美在线官网商城

    今天向您推荐国内和国外购物网站。   图片来源:123rf.com.cn 当今社会是一个信息化的社会,在这个信息高速流通的社会中,网络成了一种必不可少的渠道。网购是我们离不开的事情!中国的购物网站不计其数,今天向您推荐国内和国外购物网站,让您绝对的省钱,网购不在茫然。 国内购物网站汇总(排名不分前后): 天猫 天猫官网地址:https://www.…

    2023-07-01
  • 河北保定疫情最新情况(河北保定疫情最新情况属于高风险)

    2022年1月1日 河北省新型冠状病毒肺炎疫情情况 2022年1月1日0—24时,河北省无新增新型冠状病毒肺炎确诊病例,无新增无症状感染者。 截至1月1日24时,河北省现有确诊病例0例;尚在医学观察无症状感染者0例。 事关“加强针” 石家庄市疾控中心最新提醒 打“加强针”啦 接种新冠病毒疫苗后,体内的抗体水平会随着时间的推移出现不同程度的下降,预防病毒感染的…

    2022-01-02
  • 栋笃神探结局(栋笃神探大结局为何改了)

    栋笃神探结局(栋笃神探大结局为何改了)栋笃神探结局(栋笃神探大结局为何改了)栋笃神探结局(栋笃神探大结局为何改了)栋笃神探结局(栋笃神探大结局为何改了)

    不知道大家是否有过这样的追剧经历,一部电视剧追得好好得,男女主历经磨难,终于要修成正果时,偏偏男主或者女主被写死了,留下其中一位悲伤、感叹。这样的经历不知道大家是否体验过呢?今天就来和大家说说,那些让观众猜不到的港剧结局,有网友表示,以为大团圆收尾,结果男主死了。       小编当初在追TVB剧《幕后玩家》,这部剧由黄宗泽、黄…

    2022-01-14 投稿