python 常用的异步框架汇总整理


Posted in Python onJune 18, 2021
目录
  • 正文开始
  • 1. Tornado
  • 2. Aiohttp
  • 3.Sanic
  • 4. FastAPI
  • 5. Ruia
  • 总结
  • 参考资料

 

正文开始

asyncio 是 Python 3.4版本引入的标准库,直接内置了对异步IO的支持。

asyncio 在单线程内部维护了 EventLoop 队列,然后把需要执行异步IO的任务添加到 EventLoop 队列中,至于任务的完成通过类似回调的逻辑是实现后续的任务。如果你有 JavaScript的基础那么理解python的 asyncio 很简单,关键字、语法以及实现的原理都极其类似。

import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

# Python 3.7+
asyncio.run(main())

 

1. Tornado

Tornado 是一个Python web框架和异步网络库,起初由 FriendFeed 开发. 通过使用非阻塞网络I/O, Tornado可以支撑上万级的连接,处理 长连接, WebSockets ,和其他需要与每个用户保持长久连接的应用。

下面贴上官方 demo :

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

 

2. Aiohttp

一个基于 asyncio 异步的web框架,支持 websocket,不需要写回掉的代码、有着丰富的生态、中间价等、开箱即用的服务端与客户端。

下面贴上官方 demo :

# 客服端代码
import aiohttp
import asyncio

async def main():

    async with aiohttp.ClientSession() as session:
        async with session.get('http://python.org') as response:

            print("Status:", response.status)
            print("Content-type:", response.headers['content-type'])

            html = await response.text()
            print("Body:", html[:15], "...")

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
# 服务端代码
from aiohttp import web

async def handle(request):
    name = request.match_info.get('name', "Anonymous")
    text = "Hello, " + name
    return web.Response(text=text)

async def wshandle(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if msg.type == web.WSMsgType.text:
            await ws.send_str("Hello, {}".format(msg.data))
        elif msg.type == web.WSMsgType.binary:
            await ws.send_bytes(msg.data)
        elif msg.type == web.WSMsgType.close:
            break

    return ws


app = web.Application()
app.add_routes([web.get('/', handle),
                web.get('/echo', wshandle),
                web.get('/{name}', handle)])

if __name__ == '__main__':
    web.run_app(app)

aiohttp的生态:

  • aiohttp-session 为 aiohttp 服务提供 sessions支持,同时支持数据持久化数据库。
  • aiohttp-debugtoolbar 为 aiohttp 提供调试的工具(记录 asyncio 异常的堆栈信息)。
  • aiohttp-security 为aiohttp提供认证以及权限相关的插件。
  • aiohttp-devtools aiohttp开发工具,提供开发环境的部署、静态资源的代理。
  • aiohttp-cors CORS 跨域认证支持。
  • aiohttp-sse 服务端事件的支持(一种服务端推送消息的服务)。
  • pytest-aiohttp pytest 测试框架的支持。
  • aiohttp-mako Mako 服务端模板渲染的支持。
  • aiohttp-jinja2 Jinja2 服务端模板渲染的支持(大名鼎鼎的flask的渲染引擎)。
  • aiozipkin 分布式系统中对服务追踪,为微服务中延时问题提供数据支持。

aiohttp数据库支持:

aiopg PostgreSQL异步支持。
aiomysql MySql 异步支持。
aioredis Redis 异步支持。
asyncpg 另外一个对 PostgreSQL 异步支持,比 aiopg 效率高,但是 api 不通用。

 

3.Sanic

Sanic 是一个 Python 3.7+ 的基于 asyncio 的 web 服务器和web框架,目标是提供一种简单的方法来启动和运行一个易于构建、扩展和终极性能HTTP服务器,是一个比较类似 falsk 的异步web框架。

To provide a simple way to get up and running a highly performant HTTP server that is easy to build, to expand, and ultimately to scale.

官方demo:

from sanic import Sanic
from sanic.response import json

app = Sanic("My Hello, world app")

@app.route('/')
async def test(request):
    return json({'hello': 'world'})

if __name__ == '__main__':
    app.run()

 

4. FastAPI

FastAPI 是一个用于构建API的高性能web框架,基于Python3.6+并支持标准的 Python 类型提示。同时是最快的 Python web框架之一,可与 NodeJS 和 Go 比肩(主要归功于 Starlette 和 Pydantic)。

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

# 启动 uvicorn main:app --reload
# pip install uvicorn[standard]

 

5. Ruia

一个基于asyncio和aiohttp的异步爬虫框架,目标在于让开发者编写爬虫尽可能地方便快速。国人开发中文文档的支持,方便快速的构建爬虫项目,自定义HTML解析工具,快速获取页面数据。

官方demo:

import asyncio

from ruia import Item, TextField, AttrField


class HackerNewsItem(Item):
    target_item = TextField(css_select='tr.athing')
    title = TextField(css_select='a.storylink')
    url = AttrField(css_select='a.storylink', attr='href')


async def test_item():
    url = 'https://news.ycombinator.com/news?p=1'
    async for item in HackerNewsItem.get_items(url=url):
        print('{}: {}'.format(item.title, item.url))


if __name__ == '__main__':
    # Python 3.7 Required.
    asyncio.run(test_item()) 

    # For Python 3.6
    # loop = asyncio.get_event_loop()
    # loop.run_until_complete(test_item())

 

总结

随着 python 社区对异步支持的愈发友好,异步框架的生态也愈发完善。Tornado 是我第一个接触到的一步框架,现如今伴随着最快 python web 框架之争,Tornado也渐渐跌落神坛。但是至于谁是最快的并不重要,重要的是生态,避免重复造轮子才是重要的。

PS:

  1. 我记得之前了解 Sanic 的时候它还是基于 aiohttp 开发的 web 框架,现如今已经重构了大部分代码,核心组件也都自己实现。
  2. tornado 虽然语法过时了,但是应该是最成熟、最早以及文档最多的一个异步框架。
  3. 之前用tornado的时候还需要造关于异步操作的轮子,现如今生态日趋完善。

最后如果你想使用异步的框架,那么记得所有的IO操作均需要异步操作实现,否则会大大影响性能。 (比如第三方的短信服务不能直接使用同步代码的sdk )

 

参考资料

Aiohttp docs

Sanic 中文

Uvloop

Tornado 中文

以上就是python 常用的异步框架汇总整理的详细内容,更多关于python异步框架汇总的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python中的装饰器详解
Apr 13 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
解决PyCharm import torch包失败的问题
Oct 13 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
python列表推导和生成器表达式知识点总结
Jan 10 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
Feb 12 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 Python
Python实现的扫码工具居然这么好用!
Jun 07 Python
Opencv中cv2.floodFill算法的使用
Python下opencv使用hough变换检测直线与圆
python 网络编程要点总结
Jun 18 #Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 #Python
教你用Python+selenium搭建自动化测试环境
Jun 18 #Python
详解Python函数print用法
Jun 18 #Python
总结Python使用过程中的bug
You might like
PHP 代码规范小结
2012/03/08 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
jquery延迟对象解析
2016/10/26 Javascript
javascript常用的设计模式
2017/02/09 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
Python编程实现蚁群算法详解
2017/11/13 Python
Python装饰器模式定义与用法分析
2018/08/06 Python
Django实现跨域的2种方法
2019/07/31 Python
python3实现弹弹球小游戏
2019/11/25 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
行政助理工作职责范本
2014/03/04 职场文书
2015年重阳节主持词
2015/07/04 职场文书
田径运动会广播稿
2015/08/19 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库