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
基于yield并发执行
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自动切换
yield并发执行2

  对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计算,这样就保证了该线程能够最大限度地处于就绪态,即随时都可以被cpu执行的状态,相当于我们在用户程序级别将自己的io操作最大限度地隐藏起来,从而可以迷惑操作系统,让其看到:该线程好像是一直在计算,io比较少,从而更多的将cpu的执行权限分配给我们的线程。

yield不能检测IO,实现遇到IO自动切换,不能遇到io,就切换

猜你喜欢

转载自www.cnblogs.com/zhouhao123/p/11102070.html