”’
协程:协程是一种用户化的线程,类似于微线程
协程能保留上一次的调用状态,在单线程下实现并发的效果
协程的好处:
1、无须线程上下文切换的开销
2、无须原子操作锁定及同步的开销,原子操作就是一个最小的操作,如一个线程改一个数
3、方便切换控制流,简化编程模型
4、高并发、高扩展性、低成本:一个cpu支持上万的协程都不是问题,所以很适合用于高并发处理
缺点:
1、无法利用多核资源:协程的本质就是单线程,它不能同时将单个cpu的多核用上,
协程需要配合进程才能运行在多个cpu上,当然日常开发中没有这个必要,除非cpu密集型应用
2、进行阻塞操作(如IO时)会阻塞掉整个程序
”’
import time
# 这是一个消费者 一直在等待完成吃包子的动作
def consumer(name):
print('%s准备吃包子了!'%name) #打印出对应的消费者的名字
while True: #执行一个死循环 实际上就是需要调用时才会执行,没有调用就会停止在yield
baozi = yield #在它就收到内容的时候后就把内容传给baozi
print('包子【%s】来了,被【%s】吃了'%(baozi,name))
def producer(name):
c1 = consumer('A') #它只是把c1变成一个生成器
c2 = consumer('B') #有yield时第一次会把函数变成生成器,并不会直接调用函数
c1.__next__() #第一个next只是会走到yield然后停止
c2.__next__()
print('老子开始做包子了')
for i in range(1,10):
time.sleep(1)
print('三秒做了两个包子')
c1.send(i) #这一步其实就是调用next方法的同时传一个参数i给field接收,然后baozi=i
c2.send(i+1)
#其实这里是这样的,在send的时候只是继续执行yield下面的语句,然后去去yield,再次停在这儿
producer('aea')
c = consumer('aaa') #没next一次就会将程序执行一次
# c.__next__()
# c.__next__()
# c.__next__()