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)

相关推荐

  • 独龙族纹面,独龙族纹身艺术传承

    引言 作为我国少数民族之一的独龙族,在其民族内部存在很多特殊的文化习俗。通过对独龙族的了解可以发现,文面就是该民族内部最为重要的习俗之一。对于独龙族的女人来说,往往在十二、十三岁的时候就会进行文面了,可以说文面的存在是代表独龙族特殊的历史文化的活化石,那么在这样一个人口数量仅有7000人的小族中,为什么人们会对文面如此执着呢? 文面对独龙族内部的社会作用通过…

    2023-04-24
  • 魔兽 技能,魔兽技能特效看不见

    《魔兽技能》 在魔兽的世界里,技能是玩家们展现实力、战胜敌人的关键。每个职业都拥有独特的技能体系,这些技能不仅丰富了游戏的玩法,也为玩家们带来了无尽的挑战和乐趣。本文将深入探讨魔兽技能的各个方面,包括技能的种类、特点、使用技巧以及对游戏进程的影响等。 一、技能的种类 魔兽中的技能可以大致分为攻击技能、防御技能、辅助技能和控制技能等几大类。 攻击技能:这是玩家…

    2025-09-01
  • 中国教师备课网(中职免费教学资源网)

    一、语文备课大师 语文备课大师,语文备课室中小学语文备课中心,各个出版社教材每天更新。 二、中国语文资源网 中学语文资源网为中学语文教师提供课件教案,教学论文,中考试题,高考试题,高考作文,中考作文指导,作文素材,课堂教学实录视频,课本课文朗读,唐诗宋词诗歌朗诵,百家讲坛,子午书简,电视诗歌等。 三、无忧无虑中学语文网 无忧无虑中学语文网涵盖了语文版初中、语…

    2023-05-24 投稿
  • 自媒体平台怎么修改领域?

    自媒体能不能修改领域? 刚开始不懂,随便注册了一个领域,做了一段时间后,发现这个领域不会做,想更换领域,自媒体能不能改领域呢? 有类似问题的同学很多,包括在凯哥自媒体社群里,也会经常有学员咨询自媒体平台如何修改领域。 关于领域定位问题,凯哥在之前的文章也有详细讲解过,在正式开始运营自媒体之前,要给自己做一个规划,选择自己擅长的领域会更利用未来的发展: 1,建…

    2022-05-24 投稿
  • 抖音玲子reiko背景(抖音里的玲子reiko资料)

    喜欢看探店视频的网友们,应该都听过“玲子reiko”,她的视频看起来非常舒服。虽然她本人很有钱,但是在视频里完全看不出她是有意炫富,或者是人上人的那种高傲感觉。反而她有内涵有礼貌,对食物也非常尊重,深受网友们的喜爱。如今她也在短视频平台,已经拥有了四百万粉丝。从她的视频中可以看到,她出门时就是各种豪车换着开,从保时捷到宾利再到兰博基尼,简直就是行走的富婆。她…

    2023-02-08 投稿
  • 笑傲江湖林平之(岳不群练的什么武功)

    岳不群啊,当然是岳不群。 从主观上来说,岳不群完全没有跟余沧海争斗的意愿。可是,放着余沧海这样的高手,谁会没事去找他的麻烦呢?林平之要指望着谁主动出头帮他报仇,还不如自宫练剑比较靠谱一点。 可是,如果操作得好,林平之是可以让岳不群替他报仇的。 林平之投到岳不群门下,岳不群就有庇护弟子的义务。连岳灵珊都对林平之承诺过:“你将来报仇,做师姊的决不会袖手”呢,岳不…

    2023-05-30
  • 广州宠物用品店(广州宠物市场哪里比较好)

    来源:澎湃新闻 11月2日,澎湃新闻从广州市市场监管局获悉,广州荔湾区一家名为穆某的宠物店长期售卖带病的“星期猫、星期狗”,拒绝消费者退货、退款和赔偿要求,且存在欺诈消费者行为。2021年10月中旬,荔湾区市场监管局依法对该宠物店处以警告、罚款51.5万元,并吊销营业执照的行政处罚。 2020年10月,荔湾区市场监管局执法人员在处理消费投诉举报过程中,发现多…

    2023-05-26
  • 治理商业贿赂(反商业贿赂协议的作用)

    厘清反商业贿赂合同条款“罗生门”——苏州中院精准界定违约责任审理合同纠纷案 图为苏州中院线上开庭审理案件。 图为苏州中院线上开庭审理案件。 导读 商业贿赂是破坏公平竞争秩序、阻碍市场经济顺利发展的“暗礁”,更是反不正当竞争法、刑法所明文禁止的不法行为。反商业贿赂理所正当,但如果交易主体在合同中附加相关条款,设置不当的违约金计算标准,反而可能造成明显失衡的不公…

    2023-06-15
  • 怎么用word发邮件,邮箱投稿怎么弄

      刚开始的时候吧,我觉得投稿这是很简单的事,直到有天我的首页有个剪辑超nice~的太太问了一句 “怎么投稿?只有手机可以吗?” 我才知道,有些人在自己的圈子里是大佬,在别的地方就不一定了 于是在我一拖再拖的情况下,我被某人催着出了这个0基础新人小白的邮箱投稿教程。 希望给那些想要写作,投稿的北鼻们一点小小帮助。 (特别是某个在别的圈子里很nice…

    2023-07-03 投稿
  • 开心网上不去怎么回事(开心网打不开怎么回事)

    从飞速发展,到下降、到转型,再到被卖,捧你的是互联网,而最无情的也是互联网。 新贵崛起,旧人迟暮,一切都值得创业人去深思。 —— 献给开心网 开心网的简单历程 2008年,开心网创立,是国内第一家以办公室白领用户群体为主的社交网站,为用户提供包括日记、相册、动态记录、转帖、社交游戏在内的社交工具。 同样是2008年,由开心网开发的“开心农场”更是掀起了全民网…

    2021-12-15 投稿
  • 俄罗斯推广平台(俄罗斯外贸平台)

    俄罗斯目前主流的三大平台分别为速卖通、Ozon和 Wildberries。Ozon作为俄罗斯市场唯一的多品类综合电商平台,比其他俄罗斯电商平台具有更加丰富的销售品类,涵盖书籍、电子、服装、家庭、儿童、美妆、食物及宠物、运动等商品类目,让卖家拥有更多铺货选择。专家认为,由于具备优秀的销售能力、优质的服务、广泛的业务范围和强大的品牌,Ozon将在增长方面继续超过…

    2021-12-02
  • 七夕发红包数字含义(红包意思数字代表)

    浪漫的七夕情人节,除了要准备约会和晚餐之外,还要给女朋友发红包才对啊!七夕发多少红包合适2017?下面来了解一下七夕发红包的数字寓意吧! 一、七夕发红包的数字寓意 七夕节你准备好给女朋友买礼物了吗?没准备礼物的话就等着女朋友送你一个自由之身吧!不过实在不知道买什么好的男士们,小编建议你们不如发红包算咯!女生们收了红包自己买买买也不错啊,那么七夕发多少红包合适…

    2021-12-22