python异步web框架sanic的实现-kb88凯时官网登录

时间:2020-04-27
阅读:
免费资源网 - https://freexyz.cn/

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

github:

不过sanic对环境有要求:

  • os/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/

python异步web框架sanic的实现

请求堵塞

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

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

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

python异步web框架sanic的实现

异步非堵塞

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

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异步的使用参考上一篇文章,重新启动服务。这次前端就不在堵塞了。

python异步web框架sanic的实现

如果看 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了。

免费资源网 - https://freexyz.cn/
返回顶部
顶部
网站地图