Python进阶之关于协程的那些事

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37338590/article/details/83898670

目录

什么是协程。

Python中对协程的实现


  1. 什么是协程。

    1. 协程:又称微线程,纤程。英文名Coroutine。首先我们得知道协程是啥?协程其实可以认为是比线程更小的执行单元。 为啥说他是一个执行单元,因为他自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。一句话说明什么是线程:协程是一种用户态的轻量级线程。(其实说完之后,我自己也很然,太官方了)
    2. 协程通俗解释:线程是系统级别的,它们是由操作系统调度;协程是程序级别的,由程序员根据需要自己调度。我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序,这就是协程。也就是说同一线程下的一段代码【A】执行着执行着就可以中断,然后跳去执行另一段代码【B】,当再次回来执行代码块【A】的时候,接着从之前中断的地方开始执行。  
    3. 协程专业解释:协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。
    4. 补充:无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)也就是说,协程无法利用多核资源,协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
  2. Python中对协程的实现

    1. 利用yield实现协程
      # encoding=utf-8
      __author__ = 'Jonny'
      __location__ = '北京'
      __date__ = '2018/11/9 15:57'
      
      #消费者
      def consumer(name):
          print("要开始分苹果...")
          while True:
              print("\033[32;1m[consumer] %s\033[0m " % name)
              apple = yield
              print("[%s] 正在分苹果 %s" % (name, apple))
      
      #生产者
      def producer(obj1, obj2):
          obj1.send(None)    # 启动obj1这个生成器,第一次必须用None  <==> obj1.__next__()
          obj2.send(None)    # 启动obj2这个生成器,第一次必须用None  <==> obj2.__next__()
          n = 0
          while n < 3:
              n += 1
              print("\033[35;1m[producer]\033[0m 正在添加苹果 %s" % n)
              obj1.send(n)
              obj2.send(n)
      
      
      if __name__ == '__main__':
          con1 = consumer("消费者A")
          con2 = consumer("消费者B")
          producer(con1, con2)

      运行结果:

                  

未完待续。。。。。。。。。

猜你喜欢

转载自blog.csdn.net/m0_37338590/article/details/83898670