Выполнение Goroutine внутри обработчика http
Если я начну выполнение процедуры в обработчике http, будет ли оно выполнено даже после возврата ответа? Вот пример кода:
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)
}
В приведенном выше примере это worker
Горутин собирается завершить во всех ситуациях? Или есть какой-то особый случай, когда он не собирается завершать?
3 ответа
Да, это будет завершено, ничто не мешает.
Единственное, что мешает финишной обработке "снаружи", это возвращение из main()
функция (которая также означает завершение выполнения вашей программы, но это никогда не происходит в вашем случае). И другие обстоятельства, которые приводят к нестабильным состояниям, таким как нехватка памяти.
Да, это будет выполнено полностью независимо от вашего запроса.
Это может быть полезно для выполнения медленных операций, таких как обновления базы данных, которые не имеют отношения к вашему ответу (например, обновление счетчика просмотров).
TLDR: ДА, он завершится во всех ситуациях
Надеюсь, это даст вам больше понимания вашего вопроса.