一、协程
子程序/函数:在所有语言中都是层级调用,比如A调用B,在B执行的过程中又可以调用C,C执行完毕返回,B执行完毕返回,最后是A执行完毕一个线程就是执行一个子程序,子程序调用总是一个入口,一次返回,调用的顺序是明确的
协程概述:看上去也是子程序,但是在执行过程中,在子程序的内部可以中断,然后转而去执行别的子程序。那么不是函数调用,有点类似与CPU中断
与线程相比,协程的执行效率极高。因为只有一个线程,不存在多个变量同时写,不存在变量冲突,在协程中资源共享不加锁,只需要判断状态
1、子程序调用
#子程序调用
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()
2、数据传输
#数据传输
def A():
#空变量,存储的作用data始终为空
data = ''
r = yield data
print(1,r,data)
r = yield data
print(2,r,data)
r = yield data
print(3,r,data)
r = yield data
a = A()
#启动a
print(a.send(None))
print(a.send('a'))
二、协程原理
'''
python对协程的支持是通过generator实现的
'''
def A():
print(1)
yield 10
print(2)
yield 20
print(3)
yield 30
#协程的最简单风格,控制函数的阶段执行,节约线程或者进程的切换
#返回值是一个生成器
a = A()
print(type(a))
print(next(a))
print(next(a))
print(next(a))
三、协程写生产者与消费者
#4个生产者在生产数据 3个消费者将生产的数据从队列中取出
import threading, time, queue, random
# 生产者
def product(c):
c.send(None)
for i in range(5):
print("生产者生产了数据%d"%i)
r = c.send(str(i))
print("消费者消费了数据%s"%r)
c.close()
# 消费者
def customer():
data = ""
while True:
n = yield data
if not n:
return
print("消费者消费了%d"%n)
data ="200"
c = customer()
product(c)