HTTP 핸들러의 고루틴 실행
Go에서 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) }
응답이 작성된 후 모든 상황에서 작업자 고루틴이 완료됩니까? 그만큼 클라이언트?
답변:
작업자 고루틴은 모든 일반적인 경우에 완료됩니다. 완료를 방지하는 유일한 방법은 프로그램을 종료하거나(main()에서 반환하거나 치명적인 오류가 발생하여) 메모리가 부족해지는 것입니다.
일반적인 HTTP 요청-응답 시나리오에서 핸들러 함수(이 경우 HomeHandler)는 클라이언트에 응답을 작성한 후 반환됩니다. 그러나 프로그램이 즉시 종료되지는 않습니다. 작업자 함수를 실행하는 고루틴은 완료되거나 오류가 발생할 때까지 계속 실행됩니다.
HTTP 서버 시작을 담당하는 main() 함수는 프로그램이 종료될 때까지 계속 실행됩니다. 따라서 작업자 고루틴은 응답이 클라이언트에 전송되는 시점에 관계없이 실행을 완료할 충분한 시간을 갖습니다.
결론적으로 처음에는 직관에 반하는 것처럼 보일 수 있지만 HTTP 핸들러 내에서 시작된 고루틴은 이후에도 완료됩니다. 프로그램이 비정상적으로 종료되거나 메모리가 부족하지 않는 한 응답이 반환됩니다. 이를 통해 핸들러가 응답을 보내는 것을 차단하지 않고 비동기 작업을 수행할 수 있습니다.
위 내용은 Go의 HTTP 핸들러에 있는 고루틴은 항상 응답 후에 완료되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!