Python异步协程之旅,提高python性能

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

Mongodb的驱动为motor,它也实现了对asyncio的支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值