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)

相关推荐

  • 张继科带张蕊和小男孩同回小区(张继科在小区打球)

    近日,张继科和张蕊被媒体拍到同回小区。据悉,两人一年前就被拍到过一起出入这个小区,两人的关系似乎不一般,而此次两人一起被拍到,还有一个小男孩一路随行。不得不感叹,娱乐圈还真是个圈啊,这位张蕊正是白百何的现任张思麟的前妻。 其实在此之前,两人已经被拍到多次同框出行。从2020年开始,就陆续有两人相恋的相关传闻。2021年年底,还有网友拍到张继科和美女一起出游三…

    2023-02-03 投稿
  • 7月1日建党100周年活动文案(庆祝建党100周年)

    中央组织部向全国共产党员致以节日问候 一世纪风雨兼程,九万里风鹏正举。中国共产党的一百年,是矢志践行初心使命的一百年,是筚路蓝缕奠基立业的一百年,是创造辉煌开辟未来的一百年。在百年接续奋斗中,党团结带领人民创造了中华民族发展史、人类社会进步史上令人刮目相看的奇迹。值此党的百年华诞之际,中共中央组织部向辛勤工作在各条战线上的共产党员致以亲切的问候和良好的祝愿!…

    2022-01-12
  • excel表格卡顿严重怎么解决(excel表格很卡怎么回事)

    今天跟大家来唠唠Excel表格为什么会突然变得很卡,这也是一个粉丝问到的问题,他的表格分明只有几行数据,但是却能把鼠标卡成PPT,肉眼可见的掉帧与卡顿,非常影响工作效率,今天就跟大家分享下解决方法,大致可以分为两类情况 一、Excel体积异常 所谓的体积异常,就是Excel的体积突然之间变得很大,比如之前一个10kb左右的Excel文件,突然变成了10m左右…

    2023-06-13
  • 虚拟网店怎么开(怎么在淘宝开虚拟店铺)

    在淘宝上做虚拟产品的类目是比较常见的了,而且做虚拟产品的网店不需要考虑发货问题,但是进货的问题就需要考虑了,很多人根本不知道从哪里可以找到虚拟产品的货源,下面介绍下吧。   淘宝开店卖虚拟商品怎么进货? 点卡充值QQ业务一般都有专门的平台的,你要找大型可靠的代理平台,而且平台一般会让你交代理费的,所以要注意以免代理费打水漂。或者你做皮包公司,在你的…

    2021-11-29
  • 靠商业信息赚钱(赚钱最快的四种方法)

        靠卖苦力赚钱是最辛苦,也是最慢的一种赚钱方法。中国14亿人口,其中大部分人都是在靠卖苦力赚钱。 当然,他们的生活过得也并不富裕,有的人甚至还会负债累累。究其原因就是你赚钱的速度赶不上你老去的速度。 今天就来和大家分享下赚钱最快的四种方法, 看看你又适合做哪一种?如果一种都不适合,那也只能够是去卖苦力了,我们一起来看看: 一、靠信息…

    2022-01-06
  • 怎么试探对方是不是骗子(怎么去试探女孩子是不是在骗你)

    网恋,怎么样去试探对方的真心? 啊,在这个虚拟的网络世界,只能通过屏幕来跟对方聊天说话,也不怎么了解对方,对方顶多就算是一个最熟悉的陌生人吧,因为你不清楚,你不知道对方是真心的还是在事物的片子里,你也不知道隔着对方屏幕的对方是在甜蜜的笑着和你聊天,还是在阴险的笑着和你说话。那么如果网恋这么分别啊,怎么样去分别对方是否真的在骗你呢?   第一,特别会…

    2022-06-01 投稿
  • 手机支付宝怎么用网银转账(手机银行转账支付宝怎么转)

    手机银行的功能: 因为我在银行工作,人们使用最多的是手机银行转帐、和查询明细,今天我就说这两点。   你在那个银行开的手机银行,就可以绑你名下,同一个手机号开通那个银行的卡,这样银行卡可以绑N 个(银行与银行规定不一样,这个仅供参考),其他银行开的卡是绑不上的,但可以往任何一个银行卡里转账(跨行转帐),一天5万元,没有手续费,而且是实时到账。 &n…

    2021-12-14 投稿
  • 任嘉伦大唐荣耀剧照,大唐荣耀景甜演技

    墨浓映画眉,朱红落点唇。 2017年,由女星景甜主演的《大唐荣耀》引发了一阵收视热潮。 该剧讲述了唐朝中期民女沈珍珠与广平王李俶之间惊心动魄的爱情传奇。 沈珍珠在历史中确有其人,而且她引发的故事比影视剧更为扑朔迷离。 01 入宫为妃 大唐开元年间,江南名门沈家有一女子沈珍珠,生得端庄秀丽更兼才华横溢。 沈珍珠的出生地吴兴府,即为今天的湖州南浔一带,时至今日这…

    2023-07-02 投稿
  • 上网速度快的浏览器,浏览器哪个好用速度快又安全

    如果单纯从用户规模来看,Chrome 无疑是最受欢迎的浏览器,其次是 Microsoft Edge 和 Mozilla Firefox。但每个人的使用需求都不尽相同,有些人偏好流畅的上网体验,有些人偏好优秀的个性定制,有些人偏好丰富的功能集成,那么在 Windows 平台上哪款浏览器最适合你呢? 国外科技媒体 NeoWin 近日对 Chrome、Edge、F…

    2023-06-23 投稿
  • 糖尿病每天吃几粒枸杞,经常吃枸杞可以降血糖吗

    枸杞+保温杯,连90后都标配了,枸杞已然变成了养生界的网红。枸杞作为一种药食同源的中药食材,是有一定的含糖量的,那么,糖尿病人能否食用呢?推荐量是多少呢?下面就带大家一起了解一下相关的知识吧。 高血糖病人可以吃枸杞 很明确的讲,高血糖病人能吃枸杞,但是基于血糖水平不同、枸杞含糖量不同等情况,大致可以参照以下食用量,可以对照入座: 如果空腹血糖7.0~8.4m…

    2023-06-24
  • 淘宝图片无法显示,淘宝图片怎么复制

    《淘宝图片无法显示问题全解析及应对策略》 在我们日常的网购过程中,淘宝图片无法显示这个问题也许会时不时地给我们带来一些困扰。 它就像是一个调皮的小捣蛋,时不时地出现在我们的屏幕上,让我们的购物体验大打折扣。 那么,为什么会出现淘宝图片无法显示的情况呢?这其中又隐藏着哪些秘密呢?接下来,让我们一起深入探究这个问题。 一、网络问题导致淘宝图片无法显示 也许你会发…

    2025-03-14
  • nga注册收不到验证码(nga注册不了)

    下副本厮杀整夜的时光一去不返,因为生活才是真正的搏命战场。 作者 | 星晖 编辑 | 语境 打开NGA的App,开屏画面中有一个身着宇航服的小人,远处有一架遭遇事故的火箭,爆炸得很艺术。小人在宇宙里漂浮,手中紧握着游戏手柄,下方则是吸睛的论坛标语:“即使身处绝境……也要先来一局!” 移动游戏时代 当手机游戏玩家的队伍日益壮大,服务于玩家群体的游戏论坛便也顺势…

    2023-01-28