温馨提示:本信息由【金聪采编】搜集整理发布,版权归原作者及发布者所有,您如有异议请 举报 或者 版权申诉。

多任务 (并行和并发)

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

对于单核处理器,多进程实现多任务的原理是让操作系统给一个任务每次分配一定的 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自动执行器),无需再手动来中断和恢复了

php 简单考试系统源码,php实现在线考试系统【附源码】相关推荐

  1. (附源码)springboot在线考试系统 毕业设计 160935

    在线考试系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题. ...

  2. (附源码)php在线考试系统 毕业设计 032028

    基于PHP在线考试系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻 ...

  3. PHP题库系统源码,PHP在线考试系统源码下载

    2019独角兽企业重金招聘Python工程师标准>>> 现有PHP题库系统源码一套,题目类型支持单选,多选,判断,问答题,多题目(共享一个背景材料)等题型,有章节练习,考试等考试形式 ...

  4. php在线考试系统4.0版本,网络在线考试系统4.0 多功能一体化考试平台 可二开!在线模拟考试系统商业版PHP源码...

    源码说明: 在线考试系统应用示意通用考试管理系统将传统的培训考试与先进的网络模式相结合,使用户可根据自身特点快速构建考试.测评.练习.竞赛.调查.分析及管理 于一体的网络化考试平台,可轻松完成全员考试 ...

  5. java毕业设计——基于java+JSP+sqlserver的智能在线考试信息管理系统设计与实现(毕业论文+程序源码)——智能在线考试信息管理系统

    基于java+JSP+sqlserver的智能在线考试信息管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+JSP+sqlserver的智能在线考试信息管理系统设计与实现, ...

  6. 【小程序源码】同名在线查询系统

    这是一款支持查询同名的一款微信小程序 该款小程序支持多种查询模式 重名查询,热度查询,概率查询 有点不好的就是该款小程序的接口好像带了个二维码因为在接口上面所以去不掉 如果不介意的话这款小程序还是很好 ...

  7. 【Django毕业设计源码】python在线办公系统

    目录 一.程序介绍: 三.文档目录: 四.运行截图: 五.数据库表: 六.代码展示: 七.更多学习目录: 八.互动留言 一.程序介绍: 文档:开发技术文档.参考LW.答辩PPT,部分项目另有其他文档 ...

  8. (附源码)springboot在线投票系统 毕业设计 141307

    基于springboot在线投票系统 摘 要 随着全球Internet的迅猛发展和计算机应用的普及,特别是近几年无线网络的广阔覆盖以及无线终端设备的爆炸式增长,使得人们能够随时随地的访问网络,以获取最 ...

  9. php在线考试自动批卷_php网络在线考试组卷系统

    随着计算机技术的迅猛发展,学校教学和管理的信息化发展也有长足的进步,这就要求各个环节都均衡发展,从软硬件双方面把学校建设成一流的信息管理.教育教学的平台.本文设计开发的在线考试系统也是其中重要的一个方 ...

  10. java计算机毕业设计Web企业差旅在线管理系统(附源码、数据库)

    java计算机毕业设计Web企业差旅在线管理系统(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecl ...

最新文章

  1. linux命令行引导iso,如何在Linux上使用命令行从可启动ISO创建可启动USB?
  2. 《Windows via C/C++》学习笔记 —— “线程同步”之“检测死锁”
  3. EditPlust 批量添加自定义工具
  4. C语言试题五十九之请编写一个函数fun,它的功能时:求fibonacci数列中大于t的最小的一个数,结果由函数返回。
  5. gbase 8s oracle,GBase8s 查看数据库表空间信息
  6. 基础知识(十三)dlib python人脸检测 特征点定位
  7. 数据科学包14-matplotlib-6种图形的基本画法
  8. 【BZOJ】1052: [HAOI2007]覆盖问题(贪心)
  9. struts2中,在使用 convention 插件的情况下,如何使用 “chain” 这个resu
  10. Atitit 理财之道---支出大骗局分析与防范
  11. 怎么用计算机解锁手机密码华为,华为手机忘记解锁密码如何解锁?两招轻松搞定...
  12. PHP-FPM(PHP进程管理器)
  13. QT编程入门系列文章之二十六——反走样
  14. python实现排序算法lowb三人组之插入排序
  15. Java的重载和重写区别(面试常见)
  16. Guided Anchor论文笔记
  17. C++基础课 5- 章
  18. ServiceMesh和SideCar
  19. notepad++ 对比文档
  20. gh ost mysql_mysql 在线修改表结构工具 gh-ost

热门文章

  1. html页面加载时执行ajax请求,函数在页面加载时发送ajax请求
  2. Junit 测试 Service 层
  3. mysql适合储存高清电影的数据类型_下面选项中,适合存储高清电影的数据类型是 (5.0分)_学小易找答案...
  4. 【COCOS2DX-ANDROID-游戏开发之十六】之 APK签名,打包
  5. Java类加载过程简述
  6. javascript(JS) 0基础快速入门 (七)(事件的冒泡、委托和绑定)
  7. Android中出现Can not resolve symble ‘R’问题的解决办法
  8. 3D游戏设计作业5:改进飞碟(Hit UFO)游戏
  9. CF574B根据m简化时间
  10. 美分零钱_如何以89美分的价格获取20GB的Amazon Cloud Storage