• python 异步Web框架sanic


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

    github:GitHub - sanic-org/sanic: Accelerate your web app development | Build fast. Run fast.

    不过sanic对环境有要求:

    macOS/linux
    python 3.6+

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

    安装 sanic

    > pip3 install sanic
    

    sanic 开发第一个例子

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

    1. from sanic import Sanic
    2. from sanic.response import json
    3. from sanic.exceptions import NotFound
    4. app = Sanic(name="pyapp")
    5. @app.route('/')
    6. async def test(request):
    7. return json({'hello': 'world'})
    8. if __name__ == '__main__':
    9. app.error_handler.add(
    10. NotFound,
    11. lambda r, e: sanic.response.empty(status=404)
    12. )
    13. app.run(host='0.0.0.0', port=8000)

    运行上面的程序:

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

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

    请求堵塞

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

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

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

    异步非堵塞

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

    1. import asyncio
    2. from sanic import Sanic
    3. from sanic.response import json
    4. from sanic.exceptions import NotFound
    5. from time import sleep, ctime
    6. app = Sanic(name="pyapp")
    7. async def task_sleep():
    8. print('sleep before', ctime())
    9. await asyncio.sleep(5)
    10. print('sleep after', ctime())
    11. @app.route('/')
    12. async def test(request):
    13. myLoop = request.app.loop
    14. myLoop.create_task(task_sleep())
    15. return json({'hello': 'world'})
    16. if __name__ == '__main__':
    17. app.error_handler.add(
    18. NotFound,
    19. lambda r, e: sanic.response.empty(status=404)
    20. )
    21. app.run(host='0.0.0.0', port=8000)

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

    如果看 sanic 的运行日志:

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

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

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

    总结:

    感谢每一个认真阅读我文章的人!!!

    作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

     视频文档获取方式:
    这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方进群即可自行领取。   

  • 相关阅读:
    【NodeJs-5天学习】第一天篇④ ——了解NodeJs回调函数和事件驱动机制
    jenkins
    Jackson+Feign反序列化问题排查
    继承(六)—— 菱形继承的问题以及解决方案(初识虚基表)
    LeetCode 之 有序数组的平方
    【java基础系列】13- java的面向对象
    Ubuntu安装zsh之后搜狗起不来
    React+后端实现导出Excle表格的功能
    web网页设计实例作业HTML+CSS+JavaScript蔬菜水果商城购物设计
    筛选图片,写JSON文件和复制
  • 原文地址:https://blog.csdn.net/qq_73332379/article/details/134057120