Выполнение 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: ДА, он завершится во всех ситуациях
запускает свой собственный поток и бесконечно прослушивает входящие запросы (поток никогда не заканчивается). Следовательно, основная процедура на самом деле никогда не заканчивается, думайте об этом как о бесконечном вызове блокировки (если нет паники/сбоя). И все подпрограммы, которые вы написали бы, существовали и завершались бы в потоке, запущенномследовательно, он всегда будет завершен.
Надеюсь, это даст вам больше понимания вашего вопроса.

Другие вопросы по тегам