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

 

运行结果:

 

posted @ 2021-01-22 13:20  御姐玫瑰  阅读(330)  评论(0编辑  收藏  举报
levels of contents