Apabila melaksanakan goroutine dalam pengendali HTTP, adalah wajar untuk tertanya-tanya sama ada pelaksanaannya akan diteruskan selepas respons dikembalikan. Pertimbangkan contoh kod berikut:
package main import ( "fmt" "net/http" "time" ) func worker() { fmt.Println("worker started") time.Sleep(time.Second * 10) fmt.Println("worker completed") } func HomeHandler(w http.ResponseWriter, r *http.Request) { go worker() w.Write([]byte("Hello, World!")) } func main() { http.HandleFunc("/home", HomeHandler) http.ListenAndServe(":8081", nil) }
Kod ini memutarkan goroutine dalam HomeHandler yang tidur selama 10 saat sebelum pencetakan selesai. Sebaik sahaja respons ditulis, goroutine utama kembali daripada fungsi HomeHandler.
Dalam senario khusus ini, goroutine sememangnya akan melengkapkan pelaksanaannya, mencetak pernyataan "pekerja bermula" dan "pekerja selesai" ke konsol. Ini kerana:
Satu-satunya cara untuk menamatkan goroutine secara pramatang dalam kes ini ialah menghadapi keadaan tidak stabil, seperti berlari kehabisan ingatan, atau menghentikan goroutine secara eksplisit menggunakan teknik penyegerakan (tidak diliputi dalam contoh kod ini).
Atas ialah kandungan terperinci Adakah Goroutine Saya Akan Selesai Selepas Respons HTTP Dihantar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!