[英]How to trigger clean shutdown of FastAPI/Uvicorn
我正在使用 uvicorn 和 python 的 subprocess.Popen 運行許多 FastAPI 實例。 我有一個用 PySimpleGUI 制作的小型 GUI,我希望能夠使用它關閉服務器並隨意重新啟動它們。
我遇到的第一個問題是,至少在 Windows 中,啟動 uvicorn 服務器似乎創建的不是一個,而是兩個新進程,調用Popen.terminate()
只會關閉其中一個進程,不會釋放端口與服務器關聯。 我使用 psutil package 修復了這個問題,以檢查在我實例化 Popen object 之后創建了哪些新進程,並使用 psutil 跟蹤和終止第二個進程。
仍然存在的主要問題是,在進程上調用psutil.terminate()
不會調用@app.on_event("shutdown")
下的 FastAPI function。 過去,我們在單個終端 windows 中運行我們所有的服務器,發現在這些終端 windows 上的 ctrl-c 會調用關閉事件,但我沒有找到其他方法。 我界面上的 ctrl-c 顯然會關閉界面和所有服務器,並且在觸發所有服務器的關閉事件時有些不可靠。 我的另一個想法是使用psutil.send_signal(signal.CTRL_C_EVENT)
,但這與在終端中調用 ctrl-c 具有相同的效果。
所以我很茫然。 我看到很多帖子都說這是uvicorn的普遍缺點,但沒有看到任何直接證實我自己經驗或提供解決方案的東西。 我也知道 FastAPI 中的“關閉”和“啟動”事件是從 Starlette 移植過來的,並且在 package 中都沒有很好的記錄。我看到了使用 guvicorn 的建議,但我的簡短調查證實它不是與 windows 兼容。有什么建議嗎?
長話短說:
##### SOLUTION #####
pid = proc.pid
parent = psutil.Process(pid)
for child in parent.children(recursive=True):
child.kill()
##### SOLUTION END ####
一點解釋:
從 Rest API 作為一種架構模式的概念來看,它意味着始終等待用戶通過 web 發出的請求。優雅地管理和開發產品以優雅地關閉“曾經是”的東西從來都不是一般的意圖意味着永遠運行”,我們構建流程以使其作為一個行業保持 24/7/365 運行。
如果你想利用同一設備同時啟動或停止一對多 APIS 的能力,強烈建議你至少 go 使用容器和 Kube.netes 之類的東西,並且只需針對 Kube.netes 的 CLI 編寫腳本命令即可目的。 作為額外努力的交換,您將獲得與其他人和基礎操作系統層的進程隔離(這仍然比自己構建所有工具要少。我個人最喜歡的是甚至不這樣做並直接使用 lambdas在很多方面都更容易、 更好
與傳統的基於雲或以服務器為中心的基礎架構相比,無服務器計算具有許多優勢。 對於許多開發人員而言,無服務器架構提供了更大的可擴展性、更大的靈活性和更快的發布時間,而且成本更低。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.