zoukankan      html  css  js  c++  java
  • Gevent介绍

    安装
    pip3 install gevent
    Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 
    Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
    g1=gevent.spawn(func,1,,2,3,x=4,y=5)创建一个协程对象g1,spawn括号内第一个参数是函数名,如eat,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数eat的
    g2=gevent.spawn(func2)
    g1.join() #等待g1结束
    g2.join() #等待g2结束
    g1.value#拿到func1的返回值 
     
    code1
    import gevent
    def eat(name):
        print('%s eat 1' %name)
        gevent.sleep(2)
        print('%s eat 2' %name)
    
    
    def play(name):
        print('%s play 1' %name)
        gevent.sleep(1)
        print('%s play 2' %name)
    
    
    
    
    g1=gevent.spawn(eat,'egon')
    g2=gevent.spawn(play,name='egon')
    g1.join()
    g2.join()
    #或者gevent.joinall([g1,g2])
    print('')

    Outputs

    macname@MacdeMacBook-Pro py % python3 cccccc.py  
    egon eat 1
    egon play 1
    egon play 2
    egon eat 2
    主
    macname@MacdeMacBook-Pro py %

    上例gevent.sleep(2)模拟的是gevent可以识别的io阻塞,
    而time.sleep(2)或其他的阻塞,gevent是不能直接识别的需要用下面一行代码,打补丁,就可以识别了
    from gevent import monkey;monkey.patch_all()必须放到被打补丁者的前面,如time,socket模块之前
    或者我们干脆记忆成:要用gevent,需要将from gevent import monkey;monkey.patch_all()放到文件的开头
     
    code2
    from gevent import monkey
    monkey.patch_all()
    
    
    import gevent
    import time
    def eat():
        print('eat food 1')
        time.sleep(2)
        print('eat food 2')
    
    
    def play():
        print('play 1')
        time.sleep(1)
        print('play 2')
    start = time.time()
    g1 = gevent.spawn(eat)
    g2 = gevent.spawn(play)
    g1.join()
    g2.join()
    # gevent.joinall([g1,g2])
    end = time.time() # 3.0165441036224365
    # 如果打好了补丁 就可以识别非gevent.sleep阻塞进行切换
    print(end-start)

    Outputs

    macname@MacdeMacBook-Pro py % python3 cccccc.py
    eat food 1
    play 1
    play 2
    eat food 2
    2.0029408931732178
    macname@MacdeMacBook-Pro py %
     
     
     
     
     
     

  • 相关阅读:
    网络测量中基于Sketch方法的简单介绍
    Reading SBAR SDN flow-Based monitoring and Application Recognition
    Reading Meticulous Measurement of Control Packets in SDN
    Reading SketchVisor Robust Network Measurement for Sofeware Packet Processing
    ovs加dpdk在日志中查看更多运行细节的方法
    后缀数组
    (转载)LCA问题的Tarjan算法
    Codeforces Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) A. Checking the Calendar(水题)
    Vijos 1816统计数字(计数排序)
    卡特兰数
  • 原文地址:https://www.cnblogs.com/sea-stream/p/14192149.html
Copyright © 2011-2022 走看看