#發問 有關ASGI/ Flask/ Hypercorn 的問題(已解決)

我在測試我的Flask app 能不能同步的處理來自客戶端的請求,我使用unittest 來分別測試使用Hypercorn 來執行Flask app 及只執行Flask app。 使用Hypercorn 執行Flask app:
megapx
只執行Flask app:
megapx
Log: Run with Hypercorn:
megapx
Run without Hypercorn:
megapx
結果顯示總時間是等於最後一個請求的回應時間,從結果來看發現即使沒有使用Hypercorn,API 也可以同步的處理多個請求,為甚麼會這樣呢? —分隔線— 我想了想大家的留言去查了幾篇文章,有一些想法: 首先Flask 本身是設計成single-thread,預設並不會調用其他thread。而在底下的 Werkzeug development server 也是被設計成使用single-thread,但當中好像應用到Asynchronous, coroutine, event-loop的技術,在single-thread 的環境下並行處理http 請求。 Reference:
因此在運行Flask API server 的時候,即使flask 本身是不支援asynchronous,但底下的Werkaeug development server 是會同步的處理在伺服器的任務,在文件中有提及: ‘The current approach for storing per-context data in Python is the contextvars module. Context vars store data per thread, async task, or greenlet. This replaces the older threading.local which only handled threads.’ 從這個段落來我覺得Werkzeug development server 是實作了event-loop 來呈現concurrency 的效果。而因為coroutine 的方法有機會影響其他任務(Not thread safe),所以文件中便建議使用Gunicorn 之類的。 —分隔線— 今天再詳細閱讀Flask 的文件,發現從version 1.0 開始Development server 會預設使用Threads:
愛心
驚訝
6
26
全部留言