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)

相关推荐

  • 360和卡巴斯基哪个好,卡巴斯基介绍

    身处在互联网时代,电脑若无杀毒软件傍身犹如在黑客、钓鱼网站前裸奔,试想你的个人资料甚至银行账户密码都显露在他人面前是多么的危险。因此,给电脑装上杀毒软件是一件有必要的选择。要怎么选择一款杀毒软件来保护你的电脑安全呢?哪个杀毒软件好用,我来告诉你。   一、卡巴斯基 卡巴斯基反病毒软件是世界上拥有最尖端科技的杀毒软件之一,总部设在俄罗斯首都莫斯科,全…

    2023-07-08 投稿
  • 2元店的买卖,值得年轻人做吗?

    全国各地到处都有2元店,星罗棋布的状态,到底开一个店可以赚多少钱? 一、2元店的现状,只是噱头而已。 2元店,即卖出去的价格为2元以上一件的百货零售店,它集服装、饰品、化妆品、礼品、文体用品、家居用品、日用百货于一体,以其良好的服务态度、低廉的价格,在各地迅速发展。 这里需要指出的是,许多2元店里面的商品,卖几十甚至一百的都有,只是噱头,产品相对其他地方的卖…

    2022-04-27 创业项目
  • 商淘的多用户商城系统,淘客开发APP有哪些功能特点?

    百人团队,专业开发(成熟的产品线有,淘宝客系统,跑腿软件,刷脸系统,支持定制开发,187 0362 6073 v同) 淘客APP的开发帮您快速搭建专属的运营商版,无缝对接淘宝、天猫、京东、拼多多主流电商平台,完善的运营商 无限级代理分佣体系帮您快速拓展粉丝变现。淘客APP基于淘客系统的用户优势,通过自营商城、O2O线下店铺、区块链等多场景结合,快速积累有效用…

    2023-02-07
  • 主板音频接口,机箱接口怎么接

    作为整个主机的脸面,你的机箱在选的时候肯定也花了一番功夫。机箱的重要性可不只是颜值和兼容性,面板上的I/O区布局也值得关注,虽然看起来小,但里面的套路可一点也不少。 绝大多数机箱的I/O区都布局在前面板的顶部,或是顶板的前部,这样可以同时满足机箱放置在桌面或者位于桌下的使用,有些接口偏下或者偏后的就不用考虑了,除非你的机箱固定位置肯定不会挪动。 在功能方面,…

    2023-07-08
  • 中科院辟谣光刻机(中科院辟谣光刻机11纳米)

    近日,有关“新型5nm超高精度激光光刻加工方法”论文的通讯作者、中科院研究员、博士生导师刘前在接受媒体采访时澄清,这一技术与高端光刻机采用的极紫外光刻技术(EUV)是两回事。     今年7月,中科院网站刊登了一则国产5nm光刻技术获突破的新闻,中科院苏州纳米技术与纳米仿生研究所张子旸研究员,与国家纳米科学中心刘前研究员合作,在《纳米外报…

    2022-01-21
  • 淘宝男装代发,淘宝做代发

    《淘宝男装代发:全面解析与实操指南》 一、什么是淘宝男装代发? 淘宝男装代发,也许可以理解为一种通过互联网平台(淘宝)来进行男装销售的模式。 简单来说,就是你不需要自己去生产男装,而是从一些供应商那里获取男装的货源,然后由供应商直接将货物发给你的客户。 你在这个过程中,主要负责店铺的运营、营销和客户服务等工作。 就好像你是一个中间商,一端连接着供应商,另一端…

    2025-04-29
  • 网红喜剧电影有哪些好看的,我的极品女友全文免费阅读

    响应国家号召,推进全民健身、体育强国事业!一部根据健身题材人气IP网络小说《我的极品私教》改编青春励志正能量喜剧!第一季迷你网络剧近日于北京大兴叁间房文化创意园区顺利完成拍摄!故事讲述了一帮年轻男女发生在健身房里的有趣儿的故事,欢喜冤家青春荷尔蒙爆棚,喜剧明星千万粉丝网红加盟!HQTV全官方网络频道、爱奇艺、优酷、腾讯、快手、抖音、微视、HQTV手机频道、守…

    2023-06-23 投稿
  • 今日头条粉丝播放一万多少钱?

    头条号作为大部分自媒体朋友首选的平台,它的规则也是在不断变化的。大家最关系的还是收益规则的变化了。去年的收益计算模式已经不适用于现在了。那么现在头条的收益是怎么算的呢?1W的点击量收入有多少呢,小编就给大家介绍一下,目前头条收益的计算方式。   现在头条号的收益已经从广告补贴向内容电商、专栏等多渠道发展了。作为自媒体人不能只紧盯广告补贴这一个收益了…

    2022-06-06
  • 北京电影学院校花陈冰冰(北京电影学院校花)

    2016年4月15日,山东省滨州市一家珠宝商行举行店庆活动,将“桃花岛”搬到店门前,更有趣的是安排了一对俊男靓女扮成的“花千骨”现场吹笛演奏,高颜值令参加活动排队的人群纷纷掏出手机拍照。(图片来自东方IC) 2013年9月6日,北京电影学院校花陈冰冰化身《神雕侠侣》“小龙女”出现在校园,同学们与陈冰冰互留联系方式。(图片来自东方IC) 九寨沟《神雕侠侣》探班…

    2022-01-17
  • 怎么学打字,电脑键盘打字零基础教学

    随着计算机的普及,越来越多的人在工作和生活中需要使用计算机。有的朋友通过参与培训学会了键盘打字,有的朋友自学成才学会了键盘打字。这里我给大家分享在0基础的情况下,通过自学快速掌握键盘打字的一种方法。 键盘分区示意图 需要说明的是,键盘上有很多按键,根据按键的功能分为了不同的区域,平常使用最多的是主键盘区,而在电脑上打字使用最多的是主键盘区里标有英文大写字母的…

    2023-07-05
  • 闲鱼上卖什么比较赚钱

    走过大街小巷,我们总能够看到很多摆地摊的人,他们有的卖小饰品、有的卖玩具、还有的卖袜子,看起来都是些不怎么起眼的小生意,其实里面的赚头可大了。下面,我们分享十八个非常赚钱的地摊生意,供大家参考。 一、生活用品 如果产品多的话就需要一辆比较大的拉货车,去年毛毛看到有一摊友,摆的全是洗菜装菜的洗菜篮子,卖5元两个,生意也不错,这个产品单一的话就需要搞甩卖模式来做…

    2022-04-24
  • 如何在洛杉矶节约开支,海外仓一件代发的好处

    通过FBA仓发货的Amazon卖家应该都深有体会:中大件产品发货的物流成本很高。如今,中大件产品通过第三方海外仓操作一件代发的性价比更高,物流成本更低。 对于重量通常在十几二十公斤,甚至更重的产品,如家具家居,小家电等产品而言,头程海运 海外仓储 末端配送是目前最合理、性价比最高的一种物流形式。因为中大件相比轻小件,一件代发成本更高,并且中大件磕碰、损坏的风…

    2023-06-05