Gevent 是一个基于 greenlet 的 Python 的并发框架,以微线程 greenlet 为核心,使用了 epoll 事件监听机制以及诸多其他优化而变得高效
gevent是第三方库,通过greenlet实现协程,其基本思想是:
当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO
import gevent from gevent import monkey monkey.patch_all()
需要先声明
import gevent
from gevent import monkey
monkey.patch_all()
import time
import requests
def get_site():
# 访问一次链接
requests.get("http://www.baidu.com/").content.decode()
return 'ok'
def no_gevent():
# 没有gevent 访问20次
start = time.time()
for i in range(20):
get_site()
end = time.time()
print((end - start))
def yes_gevent():
# 有gevent 访问20次
start = time.time()
task = []
for i in range(20):
task.append(gevent.spawn(get_site))
# 阻塞主线程,直到所有协程运行完成
gevent.joinall(task)
end = time.time()
print((end - start))
for i in task:
print(i.get())
if __name__ == '__main__':
no_gevent()
yes_gevent()
测试流程:使用和不使用gevent 访问20次百度和耗时时间
测试结果:使用gevent 》耗时0.12秒
不使用gevent 》耗时2秒
备注: 也可以通过gevent池控制并发数