2015-06-29 3 views
3

Если я запустил goroutine внутри обработчика http, он будет завершен даже после возвращения ответа? Вот пример кода:Выполнение Goroutine внутри обработчика 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 goroutine собирается завершить во всех ситуациях? Или есть ли какой-нибудь особый случай, когда он не будет завершен?

ответ

6

Да, это будет завершено, ничего не остановить.

Единственное, что останавливает goroutines закончить «извне» возвращается из функции main() (что также означает завершение выполнения вашей программы, но это никогда не происходит в вашем случае). И другие обстоятельства, которые приводят к нестабильным состояниям, таким как нехватка памяти.

4

Да, он полностью не зависит от вашего запроса.

Это может быть полезно для выполнения медленных операций, таких как обновления баз данных, которые не имеют отношения к вашему ответу (например: обновить счетчик просмотров).

+0

Почему downvote? – inf

Смежные вопросы