zoukankan      html  css  js  c++  java
  • python 异步Web框架sanic

    我们继续学习Python异步编程,这里将介绍异步Web框架sanic,为什么不是tornado?从框架的易用性来说,Flask要远远比tornado简单,可惜flask不支持异步,而sanic就是类似Flask语法的异步框架。

    github:https://github.com/huge-success/sanic

    不过sanic对环境有要求:

    • macOS/linux
    • python 3.6+

    不过,我在macOS上安装 sanic 还是踩了坑。依赖库ujson一直安装失败。最后不得不卸载官方python,安装 miniconda(第三方Python安装包,集成了一些额外的工具)。

    安装 sanic

    > pip3 install sanic
    

    sanic 开发第一个例子

    编写官方的第一个例子hello.py

    from sanic import Sanic
    from sanic.response import json
    from sanic.exceptions import NotFound
    
    
    app = Sanic(name="pyapp")
    
    @app.route('/')
    async def test(request):
        return json({'hello': 'world'})
    
    
    if __name__ == '__main__':
        app.error_handler.add(
            NotFound,
            lambda r, e: sanic.response.empty(status=404)
        )
        app.run(host='0.0.0.0', port=8000)
    

    运行上面的程序:

    > python3 hello.py
    
    [2020-04-21 23:12:02 +0800] [18487] [INFO] Goin Fast @ http://0.0.0.0:8000
    [2020-04-21 23:12:02 +0800] [18487] [INFO] Starting worker [18487]
    

    通过浏览器访问:http://localhost:8000/

    请求堵塞

    针对上面的例子,假设test() 视图函数的处理需要5秒钟,那么请求就堵塞了。

    ……
    
    from time import sleep
    
    app = Sanic(name="pyapp")
    
    @app.route('/')
    async def test(request):
        sleep(5)
        return json({'hello': 'world'})
    
    ……
    

    重启服务,通过浏览器发送请求,我们发现请求耗时5秒,这显然对用户就不能忍受的。

    异步非堵塞

    所以,我们要实现异步调用,修改后的完整代码如下:

    import asyncio
    from sanic import Sanic
    from sanic.response import json
    from sanic.exceptions import NotFound
    from time import sleep, ctime
    
    app = Sanic(name="pyapp")
    
    async def task_sleep():
        print('sleep before', ctime())
        await asyncio.sleep(5)
        print('sleep after', ctime())
    
    
    @app.route('/')
    async def test(request):
        myLoop = request.app.loop
        myLoop.create_task(task_sleep())
        return json({'hello': 'world'})
    
    
    if __name__ == '__main__':
        app.error_handler.add(
            NotFound,
            lambda r, e: sanic.response.empty(status=404)
        )
        app.run(host='0.0.0.0', port=8000)
    

    关于python异步的使用参考上一篇文章,重新启动服务。这次前端就不在堵塞了。

    如果看 sanic 的运行日志:

    [2020-04-21 23:43:14 +0800] - (sanic.access)[INFO][127.0.0.1:57521]: GET http://localhost:8000/  200 17
    sleep before Tue Apr 21 23:43:14 2020
    sleep after Tue Apr 21 23:43:19 2020
    

    他仍然在执行,但不会堵塞test()视图函数的响应。

    思考:假如我的需求是:请求之后先告诉我已经处理了,然后默默的去处理,什么时候处理来再主动把处理的结果告诉。那么这就需要用到 websocket了。

  • 相关阅读:
    为PHP开发C语言扩展
    为PHP开发C++扩展
    PHP 7 vs HHVM性能对比
    Real-time storage area network
    JS书写优化
    JS书写优化
    数据库 10 大常见安全问题盘点~
    数据库 10 大常见安全问题盘点~
    数据库 10 大常见安全问题盘点~
    SQL Server 数据库定时自动备份
  • 原文地址:https://www.cnblogs.com/fnng/p/12783542.html
Copyright © 2011-2022 走看看