zoukankan      html  css  js  c++  java
  • 使用gevent实现多任务

    一、gevent的使用说明

      1、gevent的介绍:

        a、它是异步并发库,它实现并发的原理就是采用了协程的概念来实现。

        b、使用gevent模块中的spwan类创建出一个greenlet对象,

          再通过这个对象来实现多任务。

        c、gevent是对greenlet的进一步封装。

      2、安装: sudo pip3 install gevent

      3、基本语法: 

        import gevent

        gevent对象 =  gevent.spwan(任务名)

      4、特点:

        a、在执行多任务时,gevent遇到延时则自动切换任务,

          没有遇到延时则不切换任务。

        b、延时操作只能使用gevent类中自己的延时代码

          例如:time模块中的sleep方法,为了让协程有效,

            则必须使用gevent模块中的sleep方法。

      5、协程执行多任务的核心:将延时的时间利用起来去做其它的事情。

      6、常见延时操作:

        a、input函数

        b、线程的join方法

        c、TCP/UDP中的接收数据方法

    二、使用gevent实现多任务

    import gevent
    import time
    from gevent import monkey
    
    # 延时补丁
    monkey.patch_all()
    
    
    def f1(n):
        for i in range(n):
            print("-----f1-----", i)
    
            # 延时补丁已经自动替换了gevent中的sleep方法了
            time.sleep(0.2)  
    
    
    def f2(n):
        for i in range(n):
            print("-----f2-----", i)
            time.sleep(0.2)
    
    
    def f3(n):
        for i in range(n):
            print("-----f3-----", i)
            time.sleep(0.2)
    
    
    g1 = gevent.spawn(f1, 5)
    g2 = gevent.spawn(f2, 5)
    g3 = gevent.spawn(f3, 5)
    
    # 设置守护主线程,延时操作
    g1.join()  
    g2.join()  
    g3.join() 
    View Code

    运行结果:

    三、gevent精简写法(推荐)

      1、参数说明 :

        使用gevent模块中的joinall方法,可以省去写多个守护主线程的麻烦

         joinall方法的语法:

           import gevent

          gevent.joinall([greenlet对象1, greenlet对象2, greenlet对象3, ......])

        joinall的作用:程序会等待列表中的所有协程都结束后再结束当前程序

      2、示例代码

      

    import gevent
    import time
    from gevent import monkey
    
    # 延时补丁
    monkey.patch_all()
    
    
    def f1(n):
        for i in range(n):
            print("-----f1-----", i)
    
            # 延时补丁已经自动替换了gevent中的sleep方法了
            time.sleep(0.2)  
    
    
    def f2(n):
        for i in range(n):
            print("-----f2-----", i)
            time.sleep(0.2)
    
    
    def f3(n):
        for i in range(n):
            print("-----f3-----", i)
            time.sleep(0.2)
    
    
    g1 = gevent.spawn(f1, 5)
    g2 = gevent.spawn(f2, 5)
    g3 = gevent.spawn(f3, 5)
    
    # 将greenlet对象放到列表中,程序此时会等待列表中的所有协程都结束后再结束当前程序
    gevent.joinall([g1, g2, g3])
    View Code

    运行结果:

  • 相关阅读:
    洛谷P3513 [POI2011]KON-Conspiracy
    柱状图 三分法+树状数组
    CF习题集三
    CF习题集二
    CF习题集一
    单调队列总结
    SP688 SAM
    lemon使用方法
    洛谷 P2403 [SDOI2010]所驼门王的宝藏 题解
    字符串学习笔记二
  • 原文地址:https://www.cnblogs.com/yujiemeigui/p/14312772.html
Copyright © 2011-2022 走看看