使用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()
运行结果:
三、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])
运行结果: