首頁 > 後端開發 > Golang > 回傳回應後如何優雅地關閉 HTTP 伺服器?

回傳回應後如何優雅地關閉 HTTP 伺服器?

Barbara Streisand
發布: 2024-10-29 09:10:02
原創
1058 人瀏覽過

How to Gracefully Shut Down an HTTP Server After Returning a Response?

回傳回應後關閉 HTTP 伺服器

您正在開發一個使用 OAuth 與 Instagram API 互動的命令列機器人,該機器人未針對命令列進行最佳化應用程式。為了克服這個問題,您設定了一個本機 HTTP 伺服器作為授權的重新導向 URI。使用者授權應用程式並重定向到伺服器後,您希望在顯示存取權杖後關閉伺服器。

您在實現關閉機制時遇到了問題。具體來說,在請求處理程序(showTokenToUser) 中呼叫srv.Shutdown(nil) 會導致錯誤:

2017/11/23 16:02:03 Httpserver: ListenAndServe() error: http: Server closed
2017/11/23 16:02:03 http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference
登入後複製

解決方案

出現問題是因為您正在呼叫srv.Shutdown (nil)多次:

  1. 在showTokenToUser 處理程序中,它位於閉包內。
  2. 處理程序在主函數中完成執行後。

呼叫當伺服器仍在偵聽連線時 srv.Shutdown 會導致競爭狀況。 ListenAndServe() goroutine 嘗試關閉開啟的偵聽器和空閒連接,但它被處理程序閉包中對 Shutdown 的後續呼叫中斷。這種狀態不一致會觸發恐慌。

要解決此問題,您可以使用以下兩種方法之一:

1.使用context.WithCancel:

在此方法中,您將建立一個帶有取消函數的context.Context。上下文被傳遞給 ListenAndServe goroutine 和 showTokenToUser 處理函數。在處理程序內部,當存取權杖已顯示給使用者時,您可以呼叫取消函數來終止上下文。當上下文被取消時,ListenAndServe goroutine 將優雅地關閉伺服器。

2.使用相同的 Context:

您可以將相同的 context.Context 傳遞給 ListenAndServe goroutine 和處理函數,而不是呼叫 context.WithCancel。當顯示存取權杖時,您在上下文上呼叫 cancel(),這將觸發處理程序和 ListenAndServe goroutine 的關閉。

實作任一方法後,請記得等待 srv.Shutdown 函數在退出程式之前完成。

以上是回傳回應後如何優雅地關閉 HTTP 伺服器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板