溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現python異步Web框架sanic

發布時間:2020-07-30 11:16:43 來源:億速云 閱讀:416 作者:小豬 欄目:開發技術

小編這次要給大家分享的是如何實現python異步Web框架sanic,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

我們繼續學習Python異步編程,這里將介紹異步Web框架sanic,為什么不是tornado?從框架的易用性來說,Flask要遠遠比tornado簡單,可惜flask不支持異步,而sanic就是類似Flask語法的異步框架。

不過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/

如何實現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了。

看完這篇關于如何實現python異步Web框架sanic的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女