zoukankan      html  css  js  c++  java
  • 协程

    一、协程的理解

    子程序/子函数:在所有语言中,都是层级调用。比如:A调用B,在B执行
    的过程中又可以调用C,C执行完毕返回,B执行完毕返回,最后是A执行完毕
    它是通过栈实现的,一个线程就是一个子程序,子程序调用总是一个入口,一次返回,调用的顺序是明确的

    概述:协程看上去也是子程序,但执行过程中,在子程序的内部可中断。
    然后转而执行别的子程序,不是函数调用,有点类似CPU中断。

    举个例子:
    def C():
    print("C--start")
    print('C--end')

    def B():
    print('B--start')
    C()
    print('B--end')


    def A():
    print('A--start')
    B()
    print('A--end')

    A()

    def A():

    print(1)
    print(2)
    print(3)

    def B():

    print('x')
    print('y')
    print('z')

    1
    2
    x
    y
    z
    3

    执行出这个结构
    但是A中没有B的调用
    看起来A、B执行过程有点像线程,但协程的特点在于是一个线程执行

    与线程相比,协程的执行效率极高,为什么极高?
    因为它只有一个线程,也不存在同时写变量的冲突,在协程中共享资源不加锁,只需要判断状态

    二、协程原理

    Python对协程的支持是通过generator实现的
     1 def run():
     2     print(1)
     3     yield 10
     4     print(2)
     5     yield 20
     6     print(3)
     7     yield 30
     8 
     9 
    10 # 协程的最简单风格,控制函数的阶段执行,节约线程或者进程的切换
    11 m = run()  #返回值是一个生成器 代码不会往下执行!!!
    12 print(next(m))
    13 print(next(m))
    14 print(next(m))
    协程原理

    三、数据传输

     1 def run():
     2     print(1)
     3     yield 10
     4     print(2)
     5     yield 20
     6     print(3)
     7     yield 30
     8 
     9 
    10 # 协程的最简单风格,控制函数的阶段执行,节约线程或者进程的切换
    11 m = run()  #返回值是一个生成器 代码不会往下执行!!!
    12 print(next(m))
    13 print(next(m))
    14 print(next(m))
    数据传输

    四、生产者与消费者

     1 def product(c):
     2     c.send(None)
     3     for i in range(5):
     4         print('生产者产生数据%d' % i)
     5         r = c.send(str(i))
     6         print('消费者消费了数据%s' % r)
     7     c.close()
     8     
     9     
    10 def customer():
    11     data = ''
    12     while True:
    13         n = yield data
    14         if not n:
    15             return
    16         print('消费者消费了%s' % n)
    17         data = 200
    18         
    19         
    20 c = customer()
    21 product(c)
    生产者与消费者
  • 相关阅读:
    Fedora 23 配置
    小小的告别一下这个博客
    markdown测试
    ihhh题解
    【BZOJ】1998: [Hnoi2010]Fsk物品调度
    【BZOJ】2563: 阿狸和桃子的游戏
    【BZOJ】3712: [PA2014]Fiolki
    【BZOJ】2333: [SCOI2011]棘手的操作
    我的vimrc
    Ubuntu Gnome 14.04.2 lts 折腾笔记
  • 原文地址:https://www.cnblogs.com/linpd/p/10056238.html
Copyright © 2011-2022 走看看