• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python异步Web框架sanic的实现

python 搞代码 4年前 (2022-01-07) 36次浏览 已收录 0个评论

这篇文章主要介绍了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秒,这显然对用户就不能忍受的。

来源gao@daima#com搞(%代@#码网

异步非堵塞

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

 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了。

到此这篇关于python异步Web框架sanic的实现的文章就介绍到这了,更多相关python 异步 sanic内容请搜索gaodaima搞代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持gaodaima搞代码网

以上就是python异步Web框架sanic的实现的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python异步Web框架sanic的实现

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址