php简单考试系统源码,php实现在线考试系统【附源码】温馨提⽰:本信息由【⾦聪采编】搜集整理发布,版权归原作者及发布者所有,您如有异议请 举报 或者 版权申诉。
多任务 (并⾏和并发)
在讲协程之前,先谈谈多进程、多线程、并⾏和并发。
对于单核处理器,多进程实现多任务的原理是让操作系统给⼀个任务每次分配⼀定的 CPU 时间⽚,然后中断、让下⼀个任务执⾏⼀定的时间⽚接着再中断并继续执⾏下⼀个,如此反复。
由于切换执⾏任务的速度⾮常快,给外部⽤户的感受就是多个任务的执⾏是同时进⾏的。
多进程的调度是由操作系统来实现的,进程⾃⾝不能控制⾃⼰何时被调度,也就是说: 进程的调度是由外层调度器抢占式实现的
⽽协程要求当前正在运⾏的任务⾃动把控制权回传给调度器,这样就可以继续运⾏其他任务。这与抢占式的多任务正好相反, 抢占多任务的调度器可以强制中断正在运⾏的任务, 不管它⾃⼰有没有意愿。如果仅依靠程序⾃动交出控制的话,那么⼀些恶意程序将会很容易占⽤全部CPU 时间⽽不与其他任务共享。
协程的调度是由协程⾃⾝主动让出控制权到外层调度器实现的
回到刚才⽣成器实现 xrange 函数的例⼦,整个执⾏过程的交替可以⽤下图来表⽰:
协程可以理解为纯⽤户态的线程,通过协作⽽不是抢占来进⾏任务切换。
相对于进程或者线程,协程所有的操作都可以在⽤户态⽽⾮操作系统内核态完成,创建和切换的消耗⾮常低。
简单的说协程 就是提供⼀种⽅法来中断当前任务的执⾏,保存当前的局部变量,下次再过来⼜可以恢复当前局部变量继续执⾏。
我们可以把⼤任务拆分成多个⼩任务轮流执⾏,如果有某个⼩任务在等待系统 IO,就跳过它,执⾏下⼀个⼩任务,这样往复调度,实现了IO 操作和 CPU 计算的并⾏执⾏,总体上就提升了任务的执⾏效率,这也便是协程的意义
多线程
在单核下,多线程必定是并发的;
不过现在的统⼀进程的多线程是可以运⾏在多核CPU下,所以可以是并⾏的
并发(Concurrency)
是指能处理多个同时性活动的能⼒,并发事件之间不⼀定要同⼀时刻发⽣。
并⾏(Parallesim)
是指同时发⽣的两个并发事件,具有并发的含义,⽽并发则不⼀定并⾏。
多个操作可以在重叠的时间段内进⾏。
并⾏和并发区别
并发指的是程序的结构,并⾏指的是程序运⾏时的状态
并⾏⼀定是并发的,并⾏是并发设计的⼀种
单线程永远⽆法达到并⾏状态
协程
协程的⽀持是在⽣成器的基础上, 增加了可以回送数据给⽣成器的功能(调⽤者发送数据给被调⽤的⽣成器函数).
这就把⽣成器到调⽤者的单向通信转变为两者之间的双向通信.
在线代码运行器我们在上篇⽂章已经讲过了send⽅法, 下⾯让我们理解下协程
同步代码
在没有涉及到异步执⾏代码之前,我们的代码都是这样的
function printNum($max, $caller){ for ($i=0; $i
使⽤协程后改进的代码
初稿,⼿动调整⽣成器执⾏
# 本代码⼿动调整了进程执⾏代码的顺序,当然本代码实现不⽤协程也可以,只是利⽤本流程说明协程作⽤# ⽣成器给了我们函数中断,协程[⽣成器send]给了我们重新唤起⽣成器函数的能⼒function printNumWithGen($max){ for ($i=0; $isend("调度者: 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
总结
上⾯案例应该让⼤家理解了协程设计的意义和如何使⽤协程
那么接下去我们为我们的协程⾃动⼀个⾃动调度器(Co⾃动执⾏器),⽆需再⼿动来中断和恢复了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论