zoukankan      html  css  js  c++  java
  • 协程

    协程

    协程:单线程下实现并发
    并发:伪并行,遇到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)
  • 相关阅读:
    差分约束系统
    LCA
    CRB and Candies LCM 性质
    【强连通分量】 Kosaraju和Tarjan算法 (标准模板+详细注释)
    最小生成树
    堆优化的迪杰斯特拉算法
    SPFA算法
    Floyd算法
    Dijkstra算法
    图论中环的判断
  • 原文地址:https://www.cnblogs.com/SUIFAN/p/9879592.html
Copyright © 2011-2022 走看看