baijum
baijum

Reputation: 1649

Goroutine execution inside an http handler

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

Answers (3)

Shaswat Lenka
Shaswat Lenka

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

icza
icza

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

Stephan Dollberg
Stephan Dollberg

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

Related Questions