扣丁学堂PHP培训详解PHP协程知识点

2019-09-11 10:13:50 3119浏览

本篇文章扣丁学堂PHP培训小编给大家分享一下关于PHP协程的相关知识点内容,废话不多少,下面直接给大家分享PHP协程知识点,对PHP协程知识点感兴趣或者有需要的小伙伴就随小编来了解一下吧。


扣丁学堂PHP培训详解PHP协程知识点


任务 (并行和并发)


在讲协程之前,先谈谈多进程、多线程、并行和并发。

对于单核处理器,多进程实现多任务的原理是让操作系统给一个任务每次分配一定的 CPU 时间片,然后中断、让下一个任务执行一定的时间片接着再中断并继续执行下一个,如此反复。

由于切换执行任务的速度非常快,给外部用户的感受就是多个任务的执行是同时进行的。


多进程的调度是由操作系统来实现的,进程自身不能控制自己何时被调度,也就是说:进程的调度是由外层调度器抢占式实现的,而协程要求当前正在运行的任务自动把控制权回传给调度器,这样就可以继续运行其他任务。这与抢占式的多任务正好相反,抢占多任务的调度器可以强制中断正在运行的任务,不管它自己有没有意愿。如果仅依靠程序自动交出控制的话,那么一些恶意程序将会很容易占用全部CPU时间而不与其他任务共享。

协程的调度是由协程自身主动让出控制权到外层调度器实现的。


线程


在单核下,多线程必定是并发的。

不过现在的统一进程的多线程是可以运行在多核CPU下,所以可以是并行的。


并发(Concurrency)


是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。


行(Parallesim)


是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行。

多个操作可以在重叠的时间段内进行。


并行和并发区别


并发指的是程序的结构,并行指的是程序运行时的状态

并行一定是并发的,并行是并发设计的一种

单线程永远无法达到并行状态



协程的支持是在生成器的基础上, 增加了可以回送数据给生成器的功能(调用者发送数据给被调用的生成器函数)。

这就把生成器到调用者的单向通信转变为两者之间的双向通信。


下面让我们理解下协程:


在没有涉及到异步执行代码之前,我们的代码都是这样的


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

想要了解更多关于PHP开发方面内容的小伙伴,请关注扣丁学堂PHP培训官网、微信等平台,扣丁学堂IT职业在线学习教育有专业的PHP讲师为您指导,此外扣丁学堂老师精心推出的PHP视频教程定能让你快速掌握PHP从入门到精通开发实战技能。扣丁学堂PHP技术交流群:374332265。


                          JavaEE/微服务/源码解析/分布式/企业级架构【VIP体验课】


     【关注微信公众号获取更多学习资料】        【扫码进入JavaEE/微服务VIP免费公开课】  



查看更多关于“php培训资讯”的相关文章>>


标签: PHP培训 PHP视频教程 PHP在线视频 PHP学习视频 Laravel框架
微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号天丰利商场4层
京ICP备12003911号-6   Copyright © 2013 - 2019
返回顶部 返回顶部