zoukankan      html  css  js  c++  java
  • python_day10 协程 Greenlet

    reenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator

     
    from greenlet import greenlet
    
    def test1():
        print('test1,first')
        gr2.switch()
        print('test1,sencod')
        gr2.switch()
    def test2():
        print('test2,first')
        gr1.switch()
        print('test2,sencod')
    
    
    gr1=greenlet(test1)
    gr2=greenlet(test2)
    gr1.switch()

    单纯的切换(在没有io的情况下或者没有重复开辟内存空间的操作),反而会降低程序的执行速度

    #顺序执行
    import time
    def f1():
        res=0
        for i in range(10000000):
            res+=i
    
    def f2():
        res=0
        for i in range(10000000):
            res*=i
    
    
    start_time=time.time()
    f1()
    f2()
    stop_time=time.time()
    print('run time is: %s' %(stop_time-start_time)) #1.7395639419555664
    
    
    #切换
    from greenlet import greenlet
    import time
    def f1():
        res=0
        for i in range(10000000):
            res+=i
            gr2.switch()
    
    
    def f2():
        res=0
        for i in range(10000000):
            res*=i
            gr1.switch()
    
    gr1=greenlet(f1)
    gr2=greenlet(f2)
    
    start_time=time.time()
    gr1.switch()
    stop_time=time.time()
    print('run time is: %s' %(stop_time-start_time)) #7.789067983627319

    greenlet只是提供了一种比generator更加便捷的切换方式,仍然是没有解决遇到IO自动切换的问题

  • 相关阅读:
    python super()函数
    java中的方法
    python的5大数据类型操作之列表篇
    java流程控制
    eval函数 exec函数 compile函数之间的应用
    基础语法
    java中对字符串的操作
    iOS 简单的文件写入
    iOS弹出窗口
    iOS block传值和属性传值
  • 原文地址:https://www.cnblogs.com/onda/p/7111604.html
Copyright © 2011-2022 走看看