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)
  • 相关阅读:
    MyEclipse安装Freemarker插件
    C# winform webbrowser如何指定内核
    tfs清除服务器印射
    在sql中怎样把int行转化成我想要的格式,比如把1转化为'001',
    为项目加入npoi
    .net邮件错误 :The specified string is not in the form required for a subject.
    C#编程总结(十)字符转码
    ,字符串,列表,元组,字典
    简单登录,编码解码,
    密码*** ,continue,等差求和
  • 原文地址:https://www.cnblogs.com/SUIFAN/p/9879592.html
Copyright © 2011-2022 走看看