• 协程概述


    https://blog.csdn.net/chengqiuming/article/details/80573288

    协程不是进程,也不是线程,它就是一个函数,一个特殊的函数——可以在某个地方挂起,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。
    一个进程可以包含多个线程,一个线程也可以包含多个协程,也就是说,一个线程内可以有多个那样的特殊函数在运行。但是有一点,必须明确,一个线程内的多个协程的运行是串行的。如果有多核CPU的话,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内的多个协程却绝对串行的,无论有多少个CPU(核)。这个比较好理解,毕竟协程虽然是一个特殊的函数,但仍然是一个函数。一个线程内可以运行多个函数,但是这些函数都是串行运行的。当一个协程运行时,其他协程必须挂起。
    一 协程与进程、线程的比较
    虽然说,协程与进程、线程相比不是一个维度的概念,但是有时候,我们仍然需要将它们做一番比较,具体如下:
    1 协程既不是进程,也不是线程,协程仅仅是一个特殊的函数,协程跟他们就不是一个维度。
    2 一个进程可以包含多个线程,一个线程可以包含多个协程。
    3 一个线程内的多个协程虽然可以切换,但是这多个协程是串行执行的,只能在这一个线程内运行,没法利用CPU多核能力。
    4 协程与进程一样,它们的切换都存在上下文切换问题。
    表面上,进程、线程、协程都存在上下文切换的问题,但是三者上下文切换又有明显不同,见下表:
    二 协程的使用场景
    一个线程内的多个协程是串行执行的,不能利用多核,所以,显然,协程不适合计算密集型的场景。协程适合I/O 阻塞型。
    I/O本身就是阻塞型的(相较于CPU的时间世界而言)。就目前而言,无论I/O的速度多快,也比不上CPU的速度,所以一个I/O相关的程序,当其在进行I/O操作时候,CPU实际上是空闲的。
    我们假设这样的场景,如下图:1个线程有5个I/O的事情(子程序)要处理。如果我们绝对的串行化,那么当其中一个I/O阻塞时,其他4个I/O并不能得到执行,因为程序是绝对串行的,5个I/O必须一个一个排队等待处理,当一个I/O阻塞时,其它4个也得等着。
    而协程能比较好地处理这个问题,当一个协程(特殊子进程)阻塞时,它可以切换到其他没有阻塞的协程上去继续执行,这样就能得到比较高的效率,如下图所示:
    上面举的例子是5个I/O处理,如果每秒500个,5万个或500万个呢?已经达到了“I/O密集型”的程度,而“I/O密集型”确实是协程无法应付的,因为它没有利用多核的能力。这个时候的解决方案就是“多进程+协程”了。
    所以说,I/O阻塞时,利用协程来处理确实有优点(切换效率比较高),但是我们也需要看到其不能利用多核的这个缺点,必要的时候,还需要使用综合方案:多进程+协程。
    Neutorn可以归类为I/O阻塞型,所以在Neutorn的代码中处处可见协程的相关代码。
    ---------------------  
    作者:cakincqm  
    来源:CSDN  
    原文:https://blog.csdn.net/chengqiuming/article/details/80573288  
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Python的Flask框架开发RESTful API
    自研接口测试平台(Django2+Bootstrap3+Unittest)
    接口自动化测试平台 http://120.79.232.23
    ​性能优化指南:性能优化的一般性原则与方法
    性能优化指南:性能优化的一般性原则与方法
    ​性能优化指南:性能优化的一般性原则与方法
    开源自动化测试平台介绍一览
    开源自动化测试平台介绍一览
    App自动化测试方案
    SQL Server中取两个表的交集,并集和差集
  • 原文地址:https://www.cnblogs.com/fengff/p/10827869.html
Copyright © 2020-2023  润新知