HTTP 處理程序中的Goroutine 執行
在HTTP 處理程序中使用Goroutine 時,它們很自然地想知道返回回應後它們的完成狀態。讓我們來探索一下提供的範例程式碼:
// Handler that starts a goroutine func HomeHandler(w http.ResponseWriter, r *http.Request) { go worker() // Starts a goroutine called "worker" w.Write([]byte("Hello, World!")) // Sends a response to the client }
問題出現了:即使在發送 HTTP 回應之後,「worker」goroutine 也會始終完成嗎?
答案
是的,「worker」goroutine 在所有情況下都會完成。原因如下:
Goroutines 是與主程式同時執行的輕量級執行緒。使用 go 啟動一個 goroutine 會為其分配一個堆疊並搶佔其執行。一旦創建了 goroutine,它就會獨立於主程式運行,即使在當前函數(在本例中為 HomeHandler)返回之後也是如此。
在提供的範例中,goroutine 在 go worker 之後立即開始執行() 線。它會列印一條訊息來指示其開始,然後休眠 10 秒,然後列印完成訊息。
當 goroutine 運行時,HomeHandler 函數會繼續執行並將回應傳送到客戶端。然後,伺服器將請求標記為已完成並返回偵聽器,等待更多請求。
由於「worker」goroutine 獨立於處理程序,因此即使在傳送 HTTP 回應後它也會繼續運作。作業系統的調度程序允許它與其他 goroutine 共享 CPU,最終它會完成睡眠並列印完成訊息。
例外情況
有隻有少數特殊情況下Goroutine 可能無法完成:
但是,在像您的範例中提供的穩定且編寫良好的程式中,goroutine 應該成功完成其任務。
以上是HTTP 處理程序中的 Goroutine 總是在回應傳送後完成嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!