一 简述
协程:微线程,纤程 coroutine
是一种用户态的轻量级线程
协程的典型代表:生成器---yield
1. 协程是不存在的,是抽象的概念,没有协程对象,是一种运行机制
2. 定义:
协程,是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序
二 yield生成器(用yield实现协程)
yield:生产
语法:
yield 值 # 生成并返回该值
1. 一个带有yield的函数,该函数的返回值为生成器对象(generator)
生成器:是一个特殊的迭代器
是一个可迭代对象
使用next()或 __next__()查看下一个元素
def f(n):
count,a,b=0,0,1
while count
a,b=b,a+b
yield a
count+=1
fib=f(12)
for i in fib:
print(i,end=' ')
1. next()函数可以调用生成器中yield 所声明的值,每一次值会调用一个yield
2. yield 相当于协程入口,流程会在yield入口处暂停(中断)此时yield后面的代码不会执行,直到下一次调用 next函数
3. next()如何没有找到yield声明的值,则会报错StopIteration
4. 当程序中断时,对于协程,不会占用任何资源 程序在运行时才会占用资源
5. send(value)方法
1. 返回传入的值,并触发一次yield
会调用一次next()
2. send的值会作为yield的返回值进行传递
6. a=yield a 语法正确,但是此时yield不会给等号前的a赋值(此时等号前的a为None)
等号前面的a应该有send()进行赋值
7. yield 100 返回的值为100
8. yield生成器是典型的生产者小费者模型: 按需供应
def fun():
a=10
a= yield a
print('a:%s'%a)
yield 100
f=fun()
print(next(f))
print(f.send(30))
三 协程的优缺点
优点:
1. 无需线程上下文切换的开销,协程避免了无意义的调度,可以提高性能
2. 无需原子操作锁定以及同步的开销
3. 方便切换流程控制,简化编程模型
4. 高并发+高扩展+低成本:
一个单核CPU可以支持上万个协程
缺点:
1. 无法利用多核资源
2. 发生阻塞操作,会阻塞掉整个程序