Gevent是python的第三方库,提供了比较完善的对协程的支持。Python中GIL的存在,导致多线程一直不是很好用,相形之下,协程的优势就更加突出了。
Gevent的基本思想是:当遇到IO操作时,会自动写换到其他gevent,再在适当的时间切回来继续执行。这样就减少了IO操作时的等待耗时,从而能够提高硬件资源的利用率。
注:本文使用 python3.6 Django2.0.7 gevent1.3.7

首先用 Django 创建一个用来测试的接口
在 views.py 文件中写入

def random1(request):
    # 模拟随机延迟
    t = random.randint(1, 2) / 10
    time.sleep(t)
    return HttpResponse(t)

为视图添加一条路由
在 urls.py 文件中写入

urlpatterns = [
    path(r'random/',views.random1,name="random")
]

现在启动项目,一个随机延迟的接口就写好了
jiekou.JPG

编写测试文件,测试同步访问和使用协程异步访问的时间差,分别访问接口200次

import gevent
from gevent import monkey
from gevent.pool import Pool
monkey.patch_all()
import time
import requests

def get():
    a =  requests.get('http://127.0.0.1:8000/random/').text

#协程开始时间
async_time_start = time.time()
pool = Pool(30)
for q in range(200):
    pool.add(gevent.spawn(get))
pool.join()
#总用时
print('协程')
print(time.time()-async_time_start)

print('正常')
t1 = time.time()
for x in range(200):
    get()
print(time.time()-t1)

关于 monkey.patch_all() 我是这么理解的,由于切换是在IO操作时自动完成,所以 gevent 需要修改 Python 自带的一些标准库,将阻塞库变成非阻塞,这一过程在启动时通过monkey patch完成

结果:

协程
3.3803327083587646
正常
32.57835364341736

可以看到,阻塞式和非阻塞式的程序运行效率差距特别大,当数量级上升到十万级千万级的时候,阻塞式的程序将是灾难式的
因此我们要学习掌握非阻塞式的异步编程,来提高自己的姿势水平

标签: gevent, 协程

添加新评论