为什么要引入协程

协程基于线程之上,但又是比线程更加轻量级的存在,而且对内核具有不可见性

1.为什么要引入协程

这个问题和既然有个进程为什么要引入线程的原因 很类似,
下面就类比的进行讲解

  • 多线程之可以共享同一块地址和所有可用数据,这是进程所不具备的
    但带来的问题是多线程之间在进行数据同步的时候,就很有可能发生冲突(抢占式),所以往往需要添加锁来避免数据冲突(但加锁之后往往会影响程序的运行效率);
    而协程因为存在于一个线程中,所以不存在写变量的冲突(非抢占式),所以执行的效率比线程高很多
  • 线程要比进程更加轻量,创建一个线程要比创建一个进程快10 ~ 100倍,在切换的时候,由于进程是系统的多任务,进程的切换会带来大量的内存开销导致缺页中断,需要读取硬盘并加载到内存中;线程需要调用操作系统内核,涉及到从用户态切换到内核态,多个寄存器的刷新操作;而协程只有三个寄存器的值修改,只涉及到简单的现场保存和恢复
  • 性能方面,性能其实是要根据实际的情况才能判断出优劣,脱离实际谈性能就是耍流氓,并不是东西越复杂性能越好,比如如果多个线程都是cpu密集型任务,那么并不能获得性能上的增强,但如果存在着大量的计算和大量的i/0处理,拥有多个线程能彼此重叠进行,从而加快程序的执行速度;协程也是类似的情况,可以把协程理解为在用户态下的线程,因为协程是非抢占式的,需要用户自己切换到其他协程,因此同一时间其实只有一个协程拥有运行权,协程的性能主要体现在IO,协程的本质其实就是可以被暂停以及可以被恢复的函数,若一个IO操作比较消耗时间,CPU可以换到另一个协程上运行,以免CPU时间在忙等中被白白浪费。

在这里插入图片描述
协程的好处有哪些?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值