天天看點

python 異步Web架構sanic

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

sleep(5)
return json({'hello': 'world'})
           

重新開機服務,通過浏覽器發送請求,我們發現請求耗時5秒,這顯然對使用者就不能忍受的。

異步非堵塞

是以,我們要實作異步調用,修改後的完整代碼如下:

import asyncio

from time import sleep, ctime

async def task_sleep():

print('sleep before', ctime())
await asyncio.sleep(5)
print('sleep after', ctime())
           
myLoop = request.app.loop
myLoop.create_task(task_sleep())
return json({'hello': 'world'})
           
app.error_handler.add(
    NotFound,
    lambda r, e: sanic.response.empty(status=404)
)
app.run(host='0.0.0.0', port=8000)           

關于python異步的使用參考上一篇文章,重新啟動服務。這次前端就不在堵塞了。

如果看 sanic 的運作日志:

sleep before Tue Apr 21 23:43:14 2020

sleep after Tue Apr 21 23:43:19 2020

他仍然在執行,但不會堵塞test()視圖函數的響應。

原文位址

https://www.cnblogs.com/fnng/p/12783542.html