协程
协程是什么
协程当然不是卖票的软件,他可以说是程序员意淫出来的。
操作系统并不承认协程的存在
可以说协程是开发人员自己设计的能够骗过操作系统的一种方式。
操作系统—》多个进程
进程—》多个线程
线程—》多个协程
操作系统可以开多个进程,进程可以开多个线程,线程又可以开多个协程。
一切都是为了并发,而开多个协程是为了能够提高效率,为什么,看下面。
现在有一条线程,他有3个方法需要执行,第一个方法要睡三秒,第二个方法要睡四秒,第三个方法是最重要的代码在里面。
正常情况下,通过操作系统对cup的调度,要想执行完这个线程的所有任务,至少要7秒多对吧?
cup切到这个线程上,发现在io,切走了,确实io不用占用cpu也可以继续执行,但是要想在执行第二个方法,必须等上三秒,这个等待的时间,cup切到过这个线程很多很多很多次,但都发现这个线程在io,等到他结束了io,cup切了回来,看到第二个任务又是睡四秒,又是io,于是同样的事情发生了,继续等四秒。也就是说想要执行完这个线程的全部内容至少要7秒多。
现在我们聪明的程序员使用了协程,就是在这个线程里面,遇到io,自己切,并且不然操作系统发现,在这几个任务里面来回狂切,然后这些io就开始一起io了,然后最多是不是就io4秒?省下了很多时间。
要注意的是,在这io的四秒钟,cpu也会切到别的线程去,因为就算操作系统没发现你在io,你也占用了很久的cpu了,这就是两种会让cpu切换的情况之一,使用时间过长,如果不用协程,就会是io让cpu切走了。
现在被切走了又有什么关系呢?我们两个方法的io已经开始了。而且自己控制切换要比操作系统切换快的多.降低了单个线程的io时间。
最重要的一点是什么?
协程只适合io密集型任务
你们应该都发现了,他的作用就是让io一起来,不是串行。所以他在搞计算密集型的时候,就没有意义了,反而会更加耗时,因为他会不停的来回切来回切。
总结一下
python的线程用的是操作系统原生的线程
协程:单线程下实现并发
并发:切换+保存状态
多线程:操作系统帮你实现的,如果遇到io切换,执行时间过长也会切换,实现一个雨露均沾的效果.
什么样的协程是有意义的?
遇到io切换的时候才有意义
具体:
协程概念本质是程序员抽象出来的,操作系统根本不知道协程存在,也就说来了一个线程我自己遇到io 我自己线程内部直接切到自己的别的任务上了,操作系统跟本发现不了,
也就是实现了单线程下效率最高.
优点:
自己控制切换要比操作系统切换快的多
缺点:
对比多线程
自己要检测所有的io,但凡有一个阻塞整体都跟着阻塞.
对比多进程
无法利用多核优势.
为什么要有协程(遇到io切换)?
自己控制切换要比操作系统切换快的多.降低了单个线程的io时间,
原文地址:https://www.cnblogs.com/chanyuli/p/11557743.html
- Android P专区免费开放 -- 同样的Android,不同的体验
- YJango:TensorFlow中层API Datasets+TFRecord的数据导入
- CentOS7上ElasticSearch安装填坑记
- ASP.NET Core 阶段性总结
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程案例演示
- C# 窗体常用API函数 应用程序窗体查找
- C#进阶系列——WebApi接口测试工具:WebApiTestClient
- 由Dapper QueryMultiple 返回数据的问题
- 【初探IONIC】不会Native可不可以开发APP?
- MVC视图展现模式之移动布局解析-续集
- 在 ASP.NET MVC 中使用异步控制器
- MVC5 Entity Framework学习之异步和存储过程
- ConcurrentDictionary 对决 Dictionary+Locking
- 在ASP.NET 5中使用SignalR
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 让你git 时不再输入账号和密码
- JS 实现点击按钮复制一段文字
- Python操作Excel合并单元格
- CRM第一天:客户关系管理系统的环境搭建和注册
- lambda 表达式导致 Arthas 无法 redefine 的问题
- 战士上战场,还不会部署kubernetes集群?
- 使用docker python 的最新版本以及pip 安装模块
- Java面试题总结之数据库与SQL语句
- Python脚本命令行执行隐藏密码等敏感信息
- 使用SRS Docker搭建自己的直播平台
- @陈同学的专属Python教程之快速使用
- MYSQL错误码2059解决办法
- @陈同学的专属Python教程之函数
- 微信小程序的Web API接口设计及常见接口实现
- @陈同学的专属Python教程之常见数据结构