zoukankan      html  css  js  c++  java
  • 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,就切换
  • 相关阅读:
    【java基础操作】
    IDEA使用总结
    【Linus安装Jenkins】
    【Linus安装Docker】
    【Linus搭建Harbor环境】
    Markdown
    【Python】01.环境搭建
    【01-自动化测试环境搭建】
    【MongoDB入门】
    java语言程序设计 **10.25 第十章练习题 string类中split函数实现
  • 原文地址:https://www.cnblogs.com/zhouhao123/p/11102070.html
Copyright © 2011-2022 走看看