簡體   English   中英

如何觸發 FastAPI/Uvicorn 的干凈關閉

[英]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 兼容。有什么建議嗎?

長話短說:

  • API 應該是長期運行的進程
  • 整個行業都圍繞着虛擬化來自動管理何時啟動或停止服務的編排
  • 還有“無服務器”基礎設施,你可以掛起你的任何流程,而不必在這個領域花費任何精力,因為它不是一個東西
  • 如果你仍然想 go 對抗其他人並自己管理它,你可以按照這個回答的問題來做
    ##### 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM