yield实现协程
单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,
并发的本质:切换+保存状态
yield本身就是一种在单线程下可以保存任务运行状态的方法
1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级
2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换
import time def func1(): for i in range(10000): i+1 def func2(): for i in range(10000): i+1 start = time.time() func1() func2() stop=time.time() print(stop-start) 结果:0.002500295639038086
import time def func1(): while True: yield def func2(): g=func1() for i in range(10000000): i+1 next(g) start=time.time() func2() stop=time.time() print(stop-start) 结果:4.633572101593018
import time def func1(): while True: print('func1') yield def func2(): g=func1() for i in range(10000000): i+1 next(g) time.sleep(3) print('func2') start=time.time() func2() stop=time.time() print(stop-start) yield不能检测IO,实现遇到IO自动切换
对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计算,这样就保证了该线程能够最大限度地处于就绪态,即随时都可以被cpu执行的状态,相当于我们在用户程序级别将自己的io操作最大限度地隐藏起来,从而可以迷惑操作系统,让其看到:该线程好像是一直在计算,io比较少,从而更多的将cpu的执行权限分配给我们的线程。
yield不能检测IO,实现遇到IO自动切换,不能遇到io,就切换