使用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

运行结果:

原文地址:https://www.cnblogs.com/yujiemeigui/p/14312772.html