10 协程2
10.1 协程简介
协程介绍
- 协程,又称为微线程,它是实现多任务的另一种方法,只不过比线程更小的执行单元,因为它自带CPU的上下文,这样只要在合适的时机,我们就要=可以把一个协程切换到另一个协程。
CPU上下文(CPU寄存器和程序计数器):
- CPU寄存器就是CPU的内置的容量小,但速度极快的内存。
- 程序计数器则是用来存储CPU在在执行的指令位置,或者即将执行的下一条指令位置。
协程与线程差异
- 线程:每个线程都有自己缓存Cache 等等数据,操作系统还会做这些数据的恢复操作,所以线程的切换非常消耗性能。
- 协程:单纯的操作CPU的上下文,所以一秒切换上百万次系统都能抗住。所以完成多任务的效率比线程和进程都高。
10.2 yield 实现协程
- yield 实现协程
import time
def task1():
while True:
print('--1--')
time.sleep(0.1)
yield
def task2():
while True:
print("--2--")
time.sleep(0.1)
yield
def main():
t1=task1()
t2=task2()
while True:
next(t1)
next(t2)
if __name__=='__main__':
main()
生成器扩展
- next(g) 预激活
- g.send(None) 预激活
- g.send('需发送的值‘)激活yield 并且发送值
- 注意:此前必须有激活也就是next(g) 或g.send(None)
- 生成器函数的返回值在在异常中
def create_num(num):
a,b=0,1
current_num=0
while current_num <num:
res=yield a # 1.yield a 2.赋值
print(res)
a,b=b,a+b
current_num+=1
return '