fastapi 是一個非同步的web框架。
Starlette 是一個輕量級、快速的 Python ASGI 框架,專為構建高效能非同步 Web 應用和微服務而設計。它是 FastAPI 的核心依賴之一,許多 FastAPI 的功能都基於 Starlette 提供的元件。Starlette 以其簡潔的設計和豐富的功能而著稱,非常適合構建現代非同步 Web 應用。
uvicorn 是一個快速、輕量級的 Python ASGI(Asynchronous Server Gateway Interface)伺服器,專為執行高效能的非同步 Web 應用和框架而設計。uvicorn 是使用 uvloop 和 httptools 構建的,這使它在處理 HTTP 請求時表現出色,尤其適用於基於非同步 I/O 的應用。
uvloop 是一個用於 Python 的高效能事件迴圈,它是 asyncio 的一個替代實現。uvloop 是基於 libuv 構建的,libuv 是一個跨平臺的非同步 I/O 庫,廣泛用於 Node.js 和其他非同步系統中。
fastapi的ASGI伺服器是可選的,一般會選擇uvicorn。
uvicorn的事件迴圈也是可選的,一般預設使用asyncio預設的事件迴圈,也可以設定為uvloop。
事件迴圈:
- 單執行緒:在單個執行緒中只能有一個活動的事件迴圈。
- 多執行緒:你可以在不同的執行緒中建立和執行各自的事件迴圈,但每個執行緒只能有一個事件迴圈在執行。
asyncio.get_event_loop():
用於獲取當前執行緒的事件迴圈。如果不存在,則建立並返回一個新的。
適合主執行緒中的非同步任務啟動或管理。
asyncio.get_running_loop():
用於獲取當前正在執行的事件迴圈。如果沒有執行的事件迴圈則丟擲錯誤。
適合在已經執行的協程或回撥函式中使用。
asyncio.new_event_loop():
總是建立並返回一個新的事件迴圈例項,不會自動設定為當前執行緒的事件迴圈。
適合需要手動管理事件迴圈的場景,特別是在多執行緒或測試環境中。
windows系統事件迴圈策略: asyncio模組使用的windows系統的預設的事件迴圈策略。
asyncio.WindowsSelectorEventLoopPolicy: Python 3.7 及之前的版本
asyncio.WindowsProactorEventLoopPolicy: Python 3.8 及之後的版本
uvloop.EventLoopPolicy(): uvloop自己的事件迴圈策略
有時候,可能是一些庫WindowsProactorEventLoopPolicy支援的不好,在使用asyncio.run()執行非同步函式時經常報event loop is closed這樣的錯誤,這時可以考慮改變事件迴圈策略。
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
或者使用舊的方式執行非同步函式:
loop = asyncio.get_event_loop()
loop.run_until_complete(fun())