zoukankan      html  css  js  c++  java
  • 对协程的理解

    对于操作系统来说,协程其实是一种特殊的线程,对于CPU来说,协程是非抢占式(进程和线程是抢占式的),实现机理如下:

    有两个function:A, B, A调用B,B要执行一段时间,很晚才返回,A不会因为等B而一直占用CPU,即A是非阻塞的。B返回后,A又能继续执行。神奇的是,A和B又是走在一条独木桥(桥上并行只能走一条线程或者进程)上的,即A和B是一体的(和线程,进程同一级别)。那么有人会问,B要执行很久,B不就阻塞了吗,既然AB一体,B阻塞,不就是A阻塞吗?重要的来了:B是阻塞的,但是B并不是阻塞CPU,B阻塞的是除了CPU以外的资源,比如硬盘(慢)。所以,AB并不会阻塞CPU。这里,AB就是协程。

    比较一下线程,又有两个function:C,D,C执行很快,D要去读硬盘,那么如果CD一体,是一个线程,那么C一定会等D(因为线程是CPU抢占式的),那么CD就是堵塞的了。

    所以,可以看到,协程适合用在多IO,比如Web后台,每个用户来了都要读数据库,我们不能让每个用户来到离开一直占领着CPU,这时候用协程就解决了。

    这时,又有人说了,可以用多线程来实现AB啊。是可以,但是多线程就涉及到共享冲突的问题,最经典的是生产者消费者模型。

    贴来一段别人比较好的解释:

    Coroutine,翻译成”协程“,初始碰到的人马上就会跟进程和线程两个概念联系起来。直接先说区别,Coroutine是编译器级的,Process和Thread是操作系统级的。Coroutine的实现,通常是对某个语言做相应的提议,然后通过后成编译器标准,然后编译器厂商来实现该机制。Process和Thread看起来也在语言层次,但是内生原理却是操作系统先有这个东西,然后通过一定的API暴露给用户使用,两者在这里有不同。Process和Thread是os通过调度算法,保存当前的上下文,然后从上次暂停的地方再次开始计算,重新开始的地方不可预期,每次CPU计算的指令数量和代码跑过的CPU时间是相关的,跑到os分配的cpu时间到达后就会被os强制挂起。Coroutine是编译器的魔术,通过插入相关的代码使得代码段能够实现分段式的执行,重新开始的地方是yield关键字指定的,一次一定会跑到一个yield对应的地方。
    ---------------------
    作者:纯真-Cloud
    来源:CSDN
    原文:https://blog.csdn.net/chunzhenzyd/article/details/76270953
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    XmlTextWriter学习笔记(转载)
    linux shell数据重定向(输入重定向与输出重定向)详细分析
    手机信息查看
    学员信息管理系统
    DOM4j 学习笔记
    Spinner 学习笔记
    java 网络编程学习笔记
    Oracle数据库远程连接方式之:不需要安装客户端软件方法!
    SQL 基础语法(创建表空间、用户、并授予权限、数据的增删改查) (学习笔记)
    北大青鸟第一单元项目 (小说管理系统)
  • 原文地址:https://www.cnblogs.com/deepalley/p/10784054.html
Copyright © 2011-2022 走看看