Reputation: 1649
If I start a goroutine inside an http handler, is it going to complete even after returning the response ? Here is an example code:
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)
}
In the above example, is that worker
goroutine going to complete in all situations ? Or is there any special case when it is not going to complete?
Upvotes: 9
Views: 4052
Reputation: 604
TLDR: YES it will complete in all situations
http.ListenAndServe()
starts its own thread and it indefinitely listens to incoming requests (thread never ends). Hence, the main routine actually never ends, think of it like an endless blocking call,(unless there's any panic/crash). And all the routines that you would write would exist and finish within the thread started by ListenAndServe()
hence, it would always complete.
Hope this gives you some more insight to your question.
Upvotes: 0
Reputation: 417512
Yes, it will complete, there's nothing stopping it.
The only thing that stops goroutines to finish "from the outside" is returning from the main()
function (which also means finishing the execution of your program, but this never happens in your case). And other circumstances which lead to unstable states like running out of memory.
Upvotes: 10
Reputation: 34518
Yes, it will complete totally independent of your request.
This can be useful to complete slow operations such as database updates that are not relevant to your response (e.g.: update a view counter).
Upvotes: 5