• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python 常用的异步框架汇总整理

    正文开始

    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数据库支持:

    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的分布式计算框架Ray详解
    • 5分钟快速掌握Python定时任务框架的实现
    • Python编程pydantic触发及访问错误处理
    上一篇:Opencv中cv2.floodFill算法的使用
    下一篇:python中pandas对多列进行分组统计的实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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