进程、线程、协程(协程篇)

什么是协程?

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

然后就是协程的概念:

  • 看上去也是子程序,但执行过程中,在子程序的内部可终端,然后转而执行别的子程序,不是函数调用
# 协程
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()
# 协程的特点就是一个只有一个线程在执行,协程的执行效率极高
# 因为只有一个线程,也不存在同时写变量的冲突,在协程中共享资源不加锁,只需要判断状态
# 协程原理
# python 对协程的支持是通过generator实现的
def run():
    print(1)
    yield 10
    print(2)
    yield 20
    print(3)
    yield 30
# 协程的最简单风格,控制函数的阶段执行,节约协程或者进程的切换
# 返回只是一个生成器
m = run()
print(next(m))
print(next(m))
print(next(m))
# 数据传输
def run():
    # 空变量,储存的作用data始终为空
    data = ''   # 第一次执行的
    r = yield data   # 出去r=,后面也是第一次执行的;第一次执行,传递进来个空值,返回为空
    # r = a
    print(1, r, data) # 第二次传递进来的a
    r = yield data     # 第二次返回一个空
    # r = b
    print(2, r, data)
    r = yield data
    # r = c
    print(3, r, data)
    r = yield data
m = run()
print(m.send(None))
print(m.send('a'))
print(m.send('b'))
print(m.send('c'))
# 生产者与消费者
def product(a):
    a.send(None)
    for i in range(5):
        print('生产者与消费者')
        r = a.send(str(i))
        print('消费者消费了数据{}'.format(r))
    a.close()
def customer():
    data = ''
    while True::
        n = yield data
        if not n:
            return
        print('消费者消费了{}'format(n))
        data = '200'
c = customer()
product(c)

猜你喜欢

转载自blog.csdn.net/qq_43262631/article/details/85260633