Sanic框架
Sanic是一个基于uvloop构建 的 Python Web框架,旨在通过异步请求处理实现快速HTTP响应,
性能优于tornado。
Github地址:https://github.com/huge-success/sanic
注意:
由于必要的uvloop依赖性,无法在Windows上开发或部署Sanic。
注意:Sanic 的性能的确很棒,当时技术验证时,测试的时候,不同业务逻辑下,基本都能保证其性能在 Flask 的 1.5 倍以上。但是就目前的使用经验来说 Sanic 距离真正生产可用,还有相当长一段路要走。无论是内部的架构,还是周边的生态,亦或者是其他。大家可以没事拿来玩玩,但是如果要上生产线,请做好被坑的准备。
Sanic Demo
from sanic import Sanic
from sanic.response import json
app = Sanic()
@app.route('/')
async def test(request):
return json({'hello': 'world'})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
异步的一些例子练习
环境:python3.7.4
需要安装的库:asyncio
asyncio.create_task()这个方法可以异步并发的执行实例,例子如下
import asyncio
import time
async def say_after(delay, what):
await asyncio.sleep(delay)
print(what)
async def main(): # 两个实例同时执行 这就是异步的作用 比同步快了1秒
task1 = asyncio.create_task(
say_after(1, 'hello'))
task2 = asyncio.create_task(
say_after(2, 'world'))
print(f"started at {time.strftime('%X')}")
# Wait until both tasks are completed (should take
# around 2 seconds.)
await task1
await task2
print(f"finished at {time.strftime('%X')}")
asyncio.run(main())
task1,task2同时执行
aiomysql的demo,环境:需要安装aiomysql包
import asyncio
import aiomysql
loop = asyncio.get_event_loop()
@asyncio.coroutine
def test_example():
conn = yield from aiomysql.connect(host='127.0.0.1', port=3306,
user='root', password='pass', db='pass',
loop=loop)
cur = yield from conn.cursor()
yield from cur.execute("SELECT * FROM myapp_zhongzhi")
print(cur.description)
r = yield from cur.fetchall()
print(r)
yield from cur.close()
conn.close()
loop.run_until_complete(test_example())
填上你的密码和数据库名称,首先要开启数据库噢
这个库是基于pymysql(ORM)的,还有PostgreSQL的异步库
Github地址:https://github.com/MagicStack/asyncpg
性能测试
一些思考:性能比golang的库还高,都是用的协程,python不存在了GIL锁,库的底层代码不知道用什么写
wrk安装
git clone https://github.com/wg/wrk.git
make
wrk -t10 -d1m -c200 http://127.0.0.1:8080
wrk参数
-t 需要模拟的线程数
-c 需要模拟的连接数
–timeout 超时的时间
-d 测试的持续时间
结果:
Latency:响应时间
Req/Sec:每个线程每秒钟的完成的请求数
Avg:平均
Max:最大
Stdev:标准差
+/- Stdev: 正负一个标准差占比(结果的离散程度,越大越不稳定)
Requests/sec:QPS(每秒请求数)
Transfer/sec:每秒传输数量
性能测试:https://www.jianshu.com/p/e4d364b56e67?from=timeline
本人亲自实测:(虚拟机,nginx默认参数,电脑配置有点菜就不说了)
Go=Nginx(本机环境15000QPS)
Sanic:6500QPS
httpd:3544QPS
Tornado:1360QPS
附:
Centos7搭建Go环境 https://blog.csdn.net/kongshuai19900505/article/details/87257396
wrk参数说明 https://www.cnblogs.com/gao88/p/6951670.html
uvloop是个高性能的异步非阻塞框架,建立在Linux基础之上,由Cython编写而成。Uvloop最终目的使得Asyncio更加快速。
对于uvloop,可以肯定地说,我们可以利用它编写出在单核CPU中承载每秒数以万计请求的代码,在多核系统上,利用进程池可以更好地扩展其性能。
httptools是nodejs HTTP解析器的Python绑定。它仍处于非常早期的开发阶段,期望API能够突破。
为什么Sanic性能这么高,主要是几个原因:
1.异步io架构的天然优势
2.sanic把eventloop从async替换成了uvloop
3.http解析器采用的高性能的httptools
httptools的github地址:https://github.com/MagicStack/httptools
uvloop基于libuv,libuv是一个使用C语言实现的高性能异步I/O库,uvloop用来代替asyncio默认事件循环,可以进一步加快异步I/O操作的速度。
实战 | 用aiohttp和uvloop实现一个高性能爬虫: https://juejin.im/post/5acca0275188251e655ae24a