django3.0起终于支持基于asgi的异步功能了。做为python及django的做后台服务的使用者不由关心,这个大版本到底能带来多少性能的提升。django3.0 官方提供daphne、uvicorn两种方式支持asgi,哪个性能更高?
测试环境:macOS + python3.7 +django3.0 本机:127.0.0.1(去掉网络因素)
压测试工具:locust
安装过程就不写了,网上和官网都有;django3.0的APP项目文档目录有稍许变化,多了asgi.py和wsgi.py两个模式文件,在view.py中写一个简单的response数据返回接口响应GET请求。
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
正确配置路由,确保服务正常,然后进入测试环节。
第一种:使用uwsgi
正确配置uwsgi.ini文件 启动命令:uwsgi --ini uwsgi.ini
使用locust进行200并发用户的压力测试3分钟
平均 RPS 约360
平均响应时间: 约510ms
90% precentile 430ms
失败率: 2%
cpu占用:68%(有时会跳到90%,抖动估计和失败的request有关)
第二种:使用daphne
启动命令:daphne myproject.asgi:application
使用locust进行200并发用户的压力测试3分钟
平均 RPS 约430
平均响应时间: 约280ms
90% precentile 570ms
失败率: 0%
cpu占用:70%
第三种:使用uvicorn
启动命令:uvicorn myproject.asgi:application
使用locust进行200并发用户的压力测试3分钟
平均 RPS 约510
平均响应时间: 约80ms
90% precentile 190ms
失败率: 0%
cpu占用:70%
以上测试不涉及数据库及文件IO操作,可能还不全面。但从http响应来看,uvicorn更有优势,安装体积也更小。
总的来说Django3.0的异步模式带来的性能提升是显而易见的,推荐用django做web服务的开发者接入。