协程

协程

协程:单线程下实现并发
并发:伪并行,遇到IO就切换,单核下多个任务之间切换执行,给你的效果就是貌似你的几个程序在同时执行.提高效率
任务切换 + 保存状态
并行:多核cpu,真正的同时执行
串行:一个任务执行完在执行另外一个任务

多线程多进程下的任务切换+保存状态是操作系统


串行
import time

def func1():
    time.sleep(1)
    print('func1')

def func2():
    time.sleep(2)
    print('func2')

if __name__ == '__main__':
    func1()
    func2()

# 基于yield并发执行,多任务之间来回切换,这就是个简单的协程的体现,但是他能够节省I/O时间吗?不能
import time
def consumer():
    '''任务1:接收数据,处理数据'''
    while True:
        x=yield
        # time.sleep(1) #发现什么?只是进行了切换,但是并没有节省I/O时间
        print('处理了数据:',x)
def producer():
    '''任务2:生产数据'''
    g=consumer()
    # print('asdfasfasdf')
    next(g)  #找到了consumer函数的yield位置
    for i in range(3):
    # for i in range(10000000):
        g.send(i)  #给yield传值,然后再循环给下一个yield传值,并且多了切换的程序,比直接串行执行还多了一些步骤,导致执行效率反而更低了。
        print('发送了数据:',i)
start=time.time()
#基于yield保存状态,实现两个任务直接来回切换,即并发的效果
#PS:如果每个任务中都加上打印,那么明显地看到两个任务的打印是你一次我一次,即并发执行的.
producer() #我在当前线程中只执行了这个函数,但是通过这个函数里面的send切换了另外一个任务
stop=time.time()

# 串行执行的方式
res=producer()
consumer(res)
stop=time.time()

print(stop-start)

 

posted on 2018-10-30 21:11  帆总、欧巴  阅读(123)  评论(0编辑  收藏  举报

导航