当前位置:网站首页>通俗的讲解,带你入门协程
通俗的讲解,带你入门协程
2022-07-06 11:24:00 【MICAHHH】
线程
为什么要先讲线程,因为协程和线程很像。
我们都知道线程是CPU调度的最小单位,线程的存在就是为了以更小的开销实现并发,在线程执行时间片用完之后(时间片只是其中一种策略)将线程暂停,保存好线程的状态(上下文),然后转而执行其他线程。
线程的存在,让CPU不会浪费时间去等待某个线程的IO等操作。(毕竟CPU并不负责IO)
线程(甚至说进程)的调度是操作系统实现的,线程切换的实现一般放在内核,中断处理程序也是放在内核。 从这个角度来说,如果线程当前处于用户态,若要发生线程切换,必然是要先要先进入内核态,发生状态切换的。如果是用户级线程,那么在用户态直接切换线程的栈和寄存器,就不需要进入内核态。(整体开销就小)
协程与普通函数的区别
来看看一般的函数,函数只有一个出口。
再看看协程,可以类似这种函数(有多个出口和入口,还可以保存返回点,后续继续)
void func() {
print("a")
挂起(暂停并返回)
print("b")
挂起(暂停并返回)
print("c")
}
协程的底层实现
函数调用关系可以在栈上实现,是一个个栈帧的出栈入栈。但是协程看做函数的话,栈帧出栈后这个栈帧后续还要使用(只是被挂起),那么此时需要将栈帧弹出后保存在堆中。
协程和线程的区别
协程是一种在用户态进行调度的线程,所以也被称为用户态线程。一个线程开启后,协程是可以跑在这个线程上的,你可以创建多个协程,关系是一对多,只需要一个线程就可以管理很多协程,实现高并发。协程比线程要轻量很多,也能省去很多开销。
协程的历史
协程这种概念早在1958年就已经提出来了,要知道这时线程的概念都还没有提出来。到了1972年,终于有编程语言实现了这个概念,这两门编程语言就是Simula 67 以及Scheme。这一时期还没有线程,如果你想在操作系统写出并发程序那么你将不得不使用类似协程这样的技术,后来线程开始出现,操作系统终于开始原生支持程序的并发执行,就这样,协程逐渐淡出了程序员的视线。直到近些年,随着互联网的发展,尤其是移动互联网时代的到来,服务端对高并发的要求越来越高,协程再一次重回技术主流,各大编程语言都已经支持或计划开始支持协程。
协程的应用
常见提供原生协程支持的语言有:c++20、golang、python、rust 等,其他语言以库的形式提供协程功能,比如 C++20 之前腾讯的 fiber 和 libco、Java协程的类库quasar提供的纤程(其实就是协程)。
参考资料
边栏推荐
- 星诺奇科技IPO被终止:曾拟募资3.5亿元 年营收3.67亿
- 数学知识——高斯消元(初等行变换解方程组)代码实现
- Implementation of AVL tree
- Camel case with Hungarian notation
- Digital "new" operation and maintenance of energy industry
- 黑马--Redis篇
- On AAE
- Solution of commercial supply chain management platform for packaging industry: layout smart supply system and digitally integrate the supply chain of packaging industry
- Mathematical knowledge -- code implementation of Gaussian elimination (elementary line transformation to solve equations)
- 提前解锁 2 大直播主题!今天手把手教你如何完成软件包集成?|第 29-30 期
猜你喜欢
三年Android开发,2022疫情期间八家大厂的Android面试经历和真题整理
LeetCode-1279. Traffic light intersection
AutoCAD - what is the default lineweight for centerline drawing and CAD? Can I modify it?
JDBC详解
受益匪浅,安卓面试问题
[paper notes] transunet: transformers make strongencoders for medical image segmentation
[depth first search] Ji suanke: a joke of replacement
Handwritten online chat system (principle part 1)
MRO industrial products enterprise procurement system: how to refine procurement collaborative management? Industrial products enterprises that want to upgrade must see!
How word displays modification traces
随机推荐
Noninvasive and cuff free blood pressure measurement for telemedicine [translation]
How to type multiple spaces when editing CSDN articles
Fast power template for inverse element, the role of inverse element and example [the 20th summer competition of Shanghai University Programming League] permutation counting
Yutai micro rushes to the scientific innovation board: Huawei and Xiaomi fund are shareholders to raise 1.3 billion
The dplyr package of R language performs data grouping aggregation statistical transformations and calculates the grouping mean of dataframe data
Wx applet learning notes day01
R语言dplyr包进行数据分组聚合统计变换(Aggregating transforms)、计算dataframe数据的分组均值(mean)
RedisSystemException:WRONGTYPE Operation against a key holding the wrong kind of value
Detailed idea and code implementation of infix expression to suffix expression
三面蚂蚁金服成功拿到offer,Android开发社招面试经验
包装行业商业供应链管理平台解决方案:布局智慧供应体系,数字化整合包装行业供应链
Modulenotfounderror: no module named 'PIL' solution
Interview assault 63: how to remove duplication in MySQL?
The nearest library of Qinglong panel
【论文笔记】TransUNet: Transformers Make StrongEncoders for Medical Image Segmentation
朗坤智慧冲刺科创板:年营收4亿 拟募资7亿
如何提高网站权重
全套教学资料,阿里快手拼多多等7家大厂Android面试真题
关于静态类型、动态类型、id、instancetype
基于蝴蝶种类识别