什么是协程?
- 首先,先说一个前提:子程序/函数:在所有语言中都是层级调用的,比如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)