zoukankan      html  css  js  c++  java
  • 协程

    今天学习了并发编程中的最后一部分,协程

    1.协程产生的背景

    2.协程的概念

    3.yield模拟协程

    4.协程中主要的俩个模块

    5.协程的应用

    开始今日份总结

    1.协程产生的背景

      之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。

      随着我们对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。

      为此我们需要先回顾下并发的本质:切换+保存状态

      cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长

      ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态

      一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。

           二:第一种情况的切换。在任务一遇到io情况下,切到任务二去执行,这样就可以利用任务一阻塞的时间完成任务二的计算,效率的提升就在于此。

      对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计算,这样就保证了该线程能够最大限度地处于就绪态,即随时都可以被cpu执行的状态,相当于我们在用户程序级别将自己的io操作最大限度地隐藏起来,从而可以迷惑操作系统,让其看到:该线程好像是一直在计算,io比较少,从而更多的将cpu的执行权限分配给我们的线程。

      协程的本质就是在单线程下,由用户自己控制一个任务遇到io阻塞了就切换另外一个任务去执行,以此来提升效率。为了实现它,我们需要找寻一种可以同时满足以下条件的解决方案:

    #1. 可以控制多个任务之间的切换,切换之前将任务的状态保存下来,以便重新运行时,可以基于暂停的位置继续执行。
    #2. 作为1的补充:可以检测io操作,在遇到io操作的情况下才发生切换

    2.协程的概念

    协程:在其他语言中很少去用,在python中非常重要的点,对于操作系统来说,线程已经是操作系统能够看到的最小单位,操作系统无法感知协程

    • 协程的本质是,就是一条线程分成多份,每一份执行一段代码,多段代码可以在一个线程上来回切换
    • 如果能在一段代码执行,在遇到I/O操作的时候,记录此时的状态,去执行另外一段代码,相当于完成利用协程完成了更加充分利用线程的目的

    协程利用切换来规避I/O操作带来的好处

    1. 一条线程可以执行多个任务
    2. 减少了一个线程的阻塞,帮助线程最大程度的抢占CPU资源
    3. 协程由于操作系统不可见,不由操作系统控制吗,协程是用户级,减少I/O操作,提高CPU的计算能力
    4. 协程之间永远数据安全,----因为很多协程本质上就是一条线程
  • 相关阅读:
    List sort()方法
    解析器
    beautifulsoup库
    break 语句
    enumerate函数
    POJ 1915 Knight Moves
    POJ 1745 Divisibility
    POJ 1731 Orders
    POJ 1664 放苹果
    POJ 1606 Jugs
  • 原文地址:https://www.cnblogs.com/deepalley/p/12003587.html
Copyright © 2011-2022 走看看