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)

相关推荐

  • 适合一人开店的加盟店(适合一人开店,而且投资少的)

    适合一人开店的加盟店(适合一人开店,而且投资少的)适合一人开店的加盟店(适合一人开店,而且投资少的)适合一人开店的加盟店(适合一人开店,而且投资少的)适合一人开店的加盟店(适合一人开店,而且投资少的)

    目前市场上,一个人能做的小生意有很多,但要说到要赚大钱,这还是需要与个人能力相匹配。回答这个粉丝的问题,目前市场上,一个人可以做的小生意,有哪些可以赚大钱呢?我这里只能是推荐几个项目,仅供作为市场考察调研。   城市民宿 这个小生意目前很火,也比较适合一个人去经营。现在所谓的城市民宿,就是在城市中打造民宿风格的住宿场所。当下随着人们生活水平提高,年…

    2021-12-02 • 投稿
  • 一杯白酒多少两(一杯白酒大约多少两)

    一杯白酒多少两(一杯白酒大约多少两)一杯白酒多少两(一杯白酒大约多少两)一杯白酒多少两(一杯白酒大约多少两)一杯白酒多少两(一杯白酒大约多少两)

    “好哥们,大家都回来了,就等你小子回来喝酒了啊!赶紧的!” “行行行,好时候给哥几个敬酒赔罪,再过几天就回去了啊!” …… 快过年了,酒局也开始联络起来,感情好的,喝点酒情感升华,感情不好的,喝点酒握握手,大家互相谅解。在酒桌上似乎什么问题都不叫问题,如果一杯酒不够,那就再来一杯。 饮酒真的健康吗?关于饮酒一直有两种看法: 一种认为滴酒不沾就能远离酒精危害,…

    2022-05-07 • 投稿
  • 营销案例分析的总结怎么写(销售案例分析范文)

      有一个行销故事非常有意思,我记得是好几年前看过的,不过到现在依然记得很清楚,在跟一些销售朋友聊天的时候,也经常拿出来说一下,故事有点好玩,有人说这就是满满的套路,但是这背后值得大家深深去理解它的本质。   故事是这样的,有一家服装店,老板进了一件质感很好很珍贵的貂皮大衣,在店里挂了很久了,由于价格比较高,一直挂在比较显眼的地方展示,每…

    2022-01-02
  • google学术高级搜索(谷歌学术搜索技巧)

    google学术高级搜索(谷歌学术搜索技巧)google学术高级搜索(谷歌学术搜索技巧)google学术高级搜索(谷歌学术搜索技巧)google学术高级搜索(谷歌学术搜索技巧)

    检索方法介绍 GOOGLE 学术搜索的每一个搜索结果都代表一组学术成果,其中可包含一篇或多篇相关文章甚至是同一篇文章的多个版本。例如,某项搜索结果可以包含与一项研究成果相关的一组文章,其中可以有文章的预印版本、学术会议上宣读的版本、期刊上发表的版本以及编入选集的版本等。将这些文章组合在一起,可以更为准确地衡量研究工作的影响力,并且更好地展现某一领域内的各项研…

    2023-01-31 • 投稿
  • 知否原著小秦氏结局,知否赵氏父子结局

    知否原著小秦氏结局,知否赵氏父子结局知否原著小秦氏结局,知否赵氏父子结局知否原著小秦氏结局,知否赵氏父子结局知否原著小秦氏结局,知否赵氏父子结局

    近日《知否知否应是绿肥红瘦》正在热播,二叔顾廷烨被小秦氏“算计”撵出侯爵府,在六姑娘明兰的建言下,南下平定霍乱。二叔不仅功勋满满,还多次搭救赵宗全父子,为今后的逆袭做下铺垫。都说爱笑的人运气不会太差,二叔又一心向,迎来了自己人生的蜕变。 剧中老皇帝晚年膝下无子,邕王和兖王为储君之位明争暗斗。因为皇上的一封密诏,赵宗全招来杀身之祸,兖王派人扮成家丁暗杀,恰被二…

    2023-07-09 • 投稿
  • 电销外包如何收费什么流程?电话销售外包公司怎么收费

    我们都知道电销这个工作岗位客服不像其他客服好做,呼出电话销售是个有压力的职位,所以对于很多运营商来讲,想招聘到专业的电话中心客服人员不容易。但是在客服外包公司就很容易能够得到专业的电销人员,因为外包公司可以为客服提供专业的销售技巧。 一、批量呼出 电话销售的成单是有概率的,不是每个呼出电话都可以顺利交易的。如果每30-40个人就有一个下单,那么每天打200个…

    2022-04-24
  • 祝福领导前程似锦的话简短(祝领导高升的祝福语简短)

    祝福领导前程似锦的话简短(祝领导高升的祝福语简短)祝福领导前程似锦的话简短(祝领导高升的祝福语简短)祝福领导前程似锦的话简短(祝领导高升的祝福语简短)祝福领导前程似锦的话简短(祝领导高升的祝福语简短)

    现实的职场中,可能工作能力对于自己解决难题来说很重要,但是在和领导打交道时,往往情商会显得更重要;很多基层的朋友,通过自己的能力取得晋升后,明明是大好的喜事,可是在感谢领导的方式上出现错误,导致领导改变对自己的印象;有些人选择送礼、有些人选择给钱,认为只要领导接受自己的好处,才能够继续喜欢自己,却不知道自己的感谢方式会连累领导,不仅礼送不成,还会让领导鄙视自…

    2022-03-19 • 投稿
  • bootsqm.dat,BOOTSQM.dat 有什么用

    以下是一篇关于“bootsqm.dat”的文章: 《关于“bootsqm.dat”的探索与思考》 一、初识“bootsqm.dat” 当我第一次接触到“bootsqm.dat”这个东西时,我心中充满了疑惑。它到底是什么呢?也许它是某种数据文件,就像我们日常电脑中那些存储着各种信息的文件一样。我觉得它可能与某个特定的系统或程序相关联,或许是用于记录某种特定的测…

    2025-08-18
  • 关于一些网上自动赚钱的软件(网易云音乐自动挂机赚钱项目)

    网易云音乐自动挂机赚钱项目怎么样,值得做吗? 先说下,这个项目的背景由来! 网易云音乐平台,是一款专为创作音乐人打造的平台,只要创作原创音乐上传到平台即可按照点播率和广告分成获得收益。2020年开始,网易云推出云梯计划,为进一步加大流量和收益激励力度,在此基础上再新增千亿播放量,扶持原创奖励提高到每年200亿! 哪里有奖励有补贴,哪里就存在商机。脑洞大开的互…

    2022-01-09
  • 九宫飞星的计算方法(九宫飞星的口诀)

    九宫飞星的知识,包含了风水学中的大部分,是你认识与了解风水的一个基础,其内容之广泛,是一般人想象不到的。为了能够使得风水学爱好者更快速地掌握风水诀窍,小编为大家整理了九宫飞星的口诀,这是风水速成法,来看下文吧! 真正用到的布局,计算到流月即可了,流日流日无需过分排列,因这流日流时一定借助万年历二十四节气排列才能排出结果。 一、《流年紫白星起例》 歌诀:年上吉…

    2022-05-12
  • 短视频如何吸引流量(如何利用短视频发布时间来吸引流量)

    那我们标题选好了该如何更加吸引人,那接下来给大家介绍什么样的标题更加引人注目。 1、感恩类情绪表达说白了就是和用户引发共鸣,在表达感谢某件事某个人等引起用户共鸣,比如致敬经典,感恩、陪伴成才等。 2、教程、技术分享类=真材实料。 教程技术讲解分享视频什么时候都不过时,无论你是从事什么行业的视频类教程分享,比如:什么,你不信?不信你就试试撒的。 3、独特的描述…

    2022-06-06
  • 哪些大学收留学生,留学生购买免税车有什么要求

    哪些大学收留学生,留学生购买免税车有什么要求哪些大学收留学生,留学生购买免税车有什么要求哪些大学收留学生,留学生购买免税车有什么要求哪些大学收留学生,留学生购买免税车有什么要求

    从英国飞升归来的蒋小娃正式入职驾仕派,之前她首先使用“海归技能”入手了一部豪华品牌轿车,今天她就以亲身经历教大家(这里的“大家”,特指归国留学生)如何吃透“留学生免税车政策”。下面把时间交给蒋小娃,小编(老夫)也准备看看哪所海外大学肯收留俺了。 为了鼓励留学人员回国效力,归国留学生在很多方面会享受到一定的优惠政策,比如落户、创业资助、学术研究支持、子女入学优…

    2023-06-11 • 投稿