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)

相关推荐

  • 快递时效啥意思(快递时效什么意思-)

    我们经常会遇上快递超时的问题,那么超时的时间是按照什么标准设置的?可以不可以自定义修改这期间的时间差呢?下面就给大家讲解一下。 2、打开软件我们需要先选择一下快递的接口,查询哪家的选择相对应的即可,选择完成我们把要修改时间参数的单号导入到软件内先查询出物流表格。 3、点击添加单号,以一行一个的格式将单号粘贴进去,查询的速度相对来说还是比较快的,只用了几秒钟就…

    投稿 2023-04-07
  • 柠檬工坊加盟多少钱(柠檬工坊加盟多少钱一个月)

    柠檬工坊饮品在市场上名气很不错,它制作的美味饮品给消费者带来的诱惑无法抵抗,让消费者会有全新的味蕾体验,是不可多得的好品牌,不少创业者都看好该品牌的发展,想要加盟开店,那么柠檬工坊投资优势有哪些?可以随小编一起来详细地了解一下。 柠檬工坊作为市场上备受欢迎的好品牌,它的产品系列众多,每种产品都独具特色,口感与众不同,很好地俘获了消费者的心,为加盟商带来了很不…

    2023-04-06
  • 脂肪转移,眶隔脂肪释放术后注意

    “眶隔释放”,全称是“眶隔脂肪释放术”,属于眶周年轻化手术中一种非常重要的辅助术式,是将造成眼袋的眶隔脂肪向下推移,展平以及缝至眶下缘稍下的骨膜上,并且修剪平整,然后把松弛里的皮肤适量切除最后缝合达到去眼袋和泪沟的目的。 目前,眶隔脂肪释放术主要有外固定和内固定两种方式。 外固定时缝线缝合在皮肤表面,体外可见,内固定时,缝线缝合在深层组织,体表不可见缝线。一…

    2023-06-29
  • 移动硬盘识别慢,移动硬盘慢怎么解决

    如今,许多人更喜欢选择移动硬盘进行数据备份,因为它价格合理,复制速度也高于传统的数据存储介质,如CD或DVD。 但是,有时候,当你在计算机和移动硬盘驱动器之间传输数据时,移动硬盘突然变得非常慢。在这种情况下,你能做些什么来解决它?   芯享家科技分析了问题背后的7个主要原因,并为你提供相应的解决方案。 1. 长时间没有清理磁盘碎片 一般来说,在机械…

    2023-06-25
  • 这么多年和振华三部曲的关系

    [海峡网] 振华三部曲是什么?继《最好的我们》和《你好,旧时光》后,八月长安作品振华高中系列的最后一部《橘生淮南》网剧版已经与6月10日和广大剧迷们见面了。之前两部作品都捧红了男女主人公的扮演者,因此大家对新剧也颇为期待和看好。不少剧迷也好奇这前两部和《橘生淮南》的关系,那么振华三部曲的人物关系是怎样的?接下来,小编为大家带来相关介绍。 振华三部曲是哪三部?…

    投稿 2022-05-08
  • ams是什么意思(AMS的全称是)

    H/C,SEAL,ENS,TLX,ACT,AMS H/C:操作费   H/C:操作费,全名是码头操作费(终端处理费)HANDLINGCHARGE 又称代理费,也称订单变更费(换单费)。 SEAL:集装箱或车箱   SEAL:集装箱或车箱,密封。在外贸集装箱中经常使用 seal no,在集装箱中有东西,关上门,在门锁上加一个铅封,这个铅封有一个数字,这是铅封号…

    2021-11-29
  • 马云说2025年房子价钱(马云说房子白菜价)

    1、对于手头有投资性房产的人来说,接下来的五年,每一年都是最好的逃亡之年。 2、对于想要买房的人来说,接下来的每一年相对于前一年都是更好的买点。 但是把时间线划到2024年呢?这一年去世的人大约2000万,而组建家庭的人由1998年出生的人决定的,这一年出生的人口大约1900万。这一年,意味着去世的人所腾出的房子就够新组建家庭所需房子的数量了。这里并不是说年…

    2023-01-28 投稿
  • 红楼梦里最美女子排名(87版红楼梦颜值排名)

    在中国四大名著中,红楼梦这部作品中的故事,是最扣人心弦的,文字也是最为唯美沉淀的。由于这部作品太经典,所以被屡次翻拍成了影视作品,但是这么多版电视剧红楼梦中,只有87版的红楼梦,让人最为记忆犹深。在看了这部电视剧中的各位美女演员后,网友表示这可能就是经典不可超越的原因吧! 87版的红楼梦,不仅是观众心中的经典影视作品,也是剧组无数人努力下的成果。在决定翻拍红…

    2023-06-01 投稿
  • 创业白手起家做什么好(适合穷人的白手起家生意)

    这是一个粉丝的问题。目前社会上,太多没有资源、没有资金的普通人,也都在做着发财梦,想白手起家。鉴于当前的经济形势,虽然很困难,但也不是说就完全没有可能的。至于说从哪些方面着手?我认为,关键做好这几方面。   具备学习能力,先让自己强大起来。 说到白手起家,不是说不要资本投入,而是指不要资金投入而已。也就是说,白手起家需要资本,资本包括很多方面,譬如…

    2021-11-15 投稿
  • 停电了怎么查几点来电(西安停电了怎么查几点来电)

    西安供电部门 今天(5月4日)早上发布西安高新区停电情况 截至目前部分区域停电已经 超过20小时 刚刚 国网西安供电公司通过微博发布最新消息 全文如下: 国网西安供电公司加紧抢修电缆故障 停电区域陆续恢复 5月4日凌晨0时02分,西安高新区锦业一路创业新大陆地下隧道综合体工程施工现场因电缆桥架起火,引起电缆线路故障。造成高新区锦业一路周边、西郊大唐西市部分区…

    2022-05-07 投稿
  • 2022十大巅峰玄幻小说排行榜

    长夜余火作者:爱潜水的乌贼字数:281.25万字一本玄幻异界大陆类废土末日题材的网络小说,讲述了一个长夜漫漫的末日,一群人寻找希望的故事…….开局居然有统一婚配,这要是放在现代,估计能拯救无数单身狗吧,也是作者对未来的一种设想,真有一天到了末日废土重建可能体制也会发生大的变化吧。本书主要讲的是重建,长夜尽,黎明临,火种传承,生生不休。…

    投稿 2023-04-12
  • 真韵皇茶怎么样(皇茶真韵加盟teastory连锁)

    创客”一词首次出现在政府工作报告中,成为两会热词。活跃在各地的创客空间和创客们似乎也在今年呈井喷式的出现在朋友圈,而创客的主力们不是中青年反倒是平均年龄在25岁左右的90后青少年。 这是一群在互联网的世界里长大、从小不愁吃穿的“90后”们,为梦想、志趣而工作创业的他们,在创业圈的江湖里追求着属于自己的或天马行空,或璀璨炫目,或简单纯粹,或小而美的创业梦想。自…

    2021-11-30